//Copyright (c) 2019 Facebook. All rights reserved. import Foundation import CYBAVOWallet @objc(RNWalletSDK) class RNWalletSDK : NSObject { @objc func initSDK(_ configuration: NSDictionary){ if let endPoint = configuration["endpoint"]{ WalletSdk.shared.endPoint = endPoint as! String } if let apiCode = configuration["apiCode"]{ WalletSdk.shared.apiCode = apiCode as! String } if let apnsSandbox = configuration["apnsSandbox"]{ WalletSdk.shared.apnsSandbox = apnsSandbox as! Bool } } } extension RNWalletSDK { @objc func constantsToExport() -> [AnyHashable : Any]! { var constants = [AnyHashable : Any]() constants["sdkInfo"] = WalletSdk.shared.getSDKInfo() var errorCodes = [String : Any]() for err in ApiError.ErrorCode.allCases { errorCodes[err.name] = String(err.rawValue) } constants["ErrorCodes"] = errorCodes return constants } @objc static func requiresMainQueueSetup() -> Bool { return true } } extension RNWalletSDK{ class func toDictHasNil(_ any: T) -> Any { let mirror = Mirror(reflecting: any) if let style = mirror.displayStyle { if style == .collection { var array: [Any] = [] for (_, valueMaybe) in mirror.children { let value = unwrap(valueMaybe) array.append(toDictHasNil(value)) } return array } else if style == .enum { return (any as? RawEnum)?.anyRawValue ?? "" } else { var dict: [String: Any] = [:] for (labelMaybe, valueMaybe) in mirror.children { guard let label = labelMaybe else { continue } if case Optional.none = valueMaybe { dict[label] = nil }else{ let value = unwrap(valueMaybe) dict[label] = toDictHasNil(value) } } return dict } } else { return any } } class func toDict(_ any: T) -> Any { let mirror = Mirror(reflecting: any) if let style = mirror.displayStyle { if style == .collection { var array: [Any] = [] for (_, valueMaybe) in mirror.children { let value = unwrap(valueMaybe) array.append(toDict(value)) } return array } else if style == .enum { return (any as? RawEnum)?.anyRawValue ?? "" } else { var dict: [String: Any] = [:] for (labelMaybe, valueMaybe) in mirror.children { guard let label = labelMaybe else { continue } let value = unwrap(valueMaybe) dict[label] = toDict(value) } return dict } } else { return any } } class func unwrap(_ any: T) -> Any { let mirror = Mirror(reflecting: any) guard mirror.displayStyle == .optional, let first = mirror.children.first else { return any } return first.value } } public protocol RawEnum { var anyRawValue: Any { get } } public extension RawEnum where Self: RawRepresentable { public var anyRawValue: Any { get { let mirror = Mirror(reflecting: self) if mirror.displayStyle != .enum { print("WARNING: You can only extend an enum with the Enum protocol") } return rawValue as Any } } }