import BreezLiquidSDK import Foundation enum BreezLiquidSDKMapper { static func asConnectRequest(connectRequest: [String: Any?]) throws -> ConnectRequest { guard let mnemonic = connectRequest["mnemonic"] as? String else { throw LiquidSdkError.Generic(message: errMissingMandatoryField(fieldName: "mnemonic", typeName: "ConnectRequest")) } guard let networkTmp = connectRequest["network"] as? String else { throw LiquidSdkError.Generic(message: errMissingMandatoryField(fieldName: "network", typeName: "ConnectRequest")) } let network = try asNetwork(network: networkTmp) var dataDir: String? if hasNonNilKey(data: connectRequest, key: "dataDir") { guard let dataDirTmp = connectRequest["dataDir"] as? String else { throw LiquidSdkError.Generic(message: errUnexpectedValue(fieldName: "dataDir")) } dataDir = dataDirTmp } return ConnectRequest( mnemonic: mnemonic, network: network, dataDir: dataDir ) } static func dictionaryOf(connectRequest: ConnectRequest) -> [String: Any?] { return [ "mnemonic": connectRequest.mnemonic, "network": valueOf(network: connectRequest.network), "dataDir": connectRequest.dataDir == nil ? nil : connectRequest.dataDir, ] } static func asConnectRequestList(arr: [Any]) throws -> [ConnectRequest] { var list = [ConnectRequest]() for value in arr { if let val = value as? [String: Any?] { var connectRequest = try asConnectRequest(connectRequest: val) list.append(connectRequest) } else { throw LiquidSdkError.Generic(message: errUnexpectedType(typeName: "ConnectRequest")) } } return list } static func arrayOf(connectRequestList: [ConnectRequest]) -> [Any] { return connectRequestList.map { v -> [String: Any?] in dictionaryOf(connectRequest: v) } } static func asGetInfoRequest(getInfoRequest: [String: Any?]) throws -> GetInfoRequest { guard let withScan = getInfoRequest["withScan"] as? Bool else { throw LiquidSdkError.Generic(message: errMissingMandatoryField(fieldName: "withScan", typeName: "GetInfoRequest")) } return GetInfoRequest( withScan: withScan) } static func dictionaryOf(getInfoRequest: GetInfoRequest) -> [String: Any?] { return [ "withScan": getInfoRequest.withScan, ] } static func asGetInfoRequestList(arr: [Any]) throws -> [GetInfoRequest] { var list = [GetInfoRequest]() for value in arr { if let val = value as? [String: Any?] { var getInfoRequest = try asGetInfoRequest(getInfoRequest: val) list.append(getInfoRequest) } else { throw LiquidSdkError.Generic(message: errUnexpectedType(typeName: "GetInfoRequest")) } } return list } static func arrayOf(getInfoRequestList: [GetInfoRequest]) -> [Any] { return getInfoRequestList.map { v -> [String: Any?] in dictionaryOf(getInfoRequest: v) } } static func asGetInfoResponse(getInfoResponse: [String: Any?]) throws -> GetInfoResponse { guard let balanceSat = getInfoResponse["balanceSat"] as? UInt64 else { throw LiquidSdkError.Generic(message: errMissingMandatoryField(fieldName: "balanceSat", typeName: "GetInfoResponse")) } guard let pendingSendSat = getInfoResponse["pendingSendSat"] as? UInt64 else { throw LiquidSdkError.Generic(message: errMissingMandatoryField(fieldName: "pendingSendSat", typeName: "GetInfoResponse")) } guard let pendingReceiveSat = getInfoResponse["pendingReceiveSat"] as? UInt64 else { throw LiquidSdkError.Generic(message: errMissingMandatoryField(fieldName: "pendingReceiveSat", typeName: "GetInfoResponse")) } guard let pubkey = getInfoResponse["pubkey"] as? String else { throw LiquidSdkError.Generic(message: errMissingMandatoryField(fieldName: "pubkey", typeName: "GetInfoResponse")) } return GetInfoResponse( balanceSat: balanceSat, pendingSendSat: pendingSendSat, pendingReceiveSat: pendingReceiveSat, pubkey: pubkey ) } static func dictionaryOf(getInfoResponse: GetInfoResponse) -> [String: Any?] { return [ "balanceSat": getInfoResponse.balanceSat, "pendingSendSat": getInfoResponse.pendingSendSat, "pendingReceiveSat": getInfoResponse.pendingReceiveSat, "pubkey": getInfoResponse.pubkey, ] } static func asGetInfoResponseList(arr: [Any]) throws -> [GetInfoResponse] { var list = [GetInfoResponse]() for value in arr { if let val = value as? [String: Any?] { var getInfoResponse = try asGetInfoResponse(getInfoResponse: val) list.append(getInfoResponse) } else { throw LiquidSdkError.Generic(message: errUnexpectedType(typeName: "GetInfoResponse")) } } return list } static func arrayOf(getInfoResponseList: [GetInfoResponse]) -> [Any] { return getInfoResponseList.map { v -> [String: Any?] in dictionaryOf(getInfoResponse: v) } } static func asPayment(payment: [String: Any?]) throws -> Payment { guard let txId = payment["txId"] as? String else { throw LiquidSdkError.Generic(message: errMissingMandatoryField(fieldName: "txId", typeName: "Payment")) } var swapId: String? if hasNonNilKey(data: payment, key: "swapId") { guard let swapIdTmp = payment["swapId"] as? String else { throw LiquidSdkError.Generic(message: errUnexpectedValue(fieldName: "swapId")) } swapId = swapIdTmp } guard let timestamp = payment["timestamp"] as? UInt32 else { throw LiquidSdkError.Generic(message: errMissingMandatoryField(fieldName: "timestamp", typeName: "Payment")) } guard let amountSat = payment["amountSat"] as? UInt64 else { throw LiquidSdkError.Generic(message: errMissingMandatoryField(fieldName: "amountSat", typeName: "Payment")) } var feesSat: UInt64? if hasNonNilKey(data: payment, key: "feesSat") { guard let feesSatTmp = payment["feesSat"] as? UInt64 else { throw LiquidSdkError.Generic(message: errUnexpectedValue(fieldName: "feesSat")) } feesSat = feesSatTmp } guard let paymentTypeTmp = payment["paymentType"] as? String else { throw LiquidSdkError.Generic(message: errMissingMandatoryField(fieldName: "paymentType", typeName: "Payment")) } let paymentType = try asPaymentType(paymentType: paymentTypeTmp) guard let statusTmp = payment["status"] as? String else { throw LiquidSdkError.Generic(message: errMissingMandatoryField(fieldName: "status", typeName: "Payment")) } let status = try asPaymentState(paymentState: statusTmp) return Payment( txId: txId, swapId: swapId, timestamp: timestamp, amountSat: amountSat, feesSat: feesSat, paymentType: paymentType, status: status ) } static func dictionaryOf(payment: Payment) -> [String: Any?] { return [ "txId": payment.txId, "swapId": payment.swapId == nil ? nil : payment.swapId, "timestamp": payment.timestamp, "amountSat": payment.amountSat, "feesSat": payment.feesSat == nil ? nil : payment.feesSat, "paymentType": valueOf(paymentType: payment.paymentType), "status": valueOf(paymentState: payment.status), ] } static func asPaymentList(arr: [Any]) throws -> [Payment] { var list = [Payment]() for value in arr { if let val = value as? [String: Any?] { var payment = try asPayment(payment: val) list.append(payment) } else { throw LiquidSdkError.Generic(message: errUnexpectedType(typeName: "Payment")) } } return list } static func arrayOf(paymentList: [Payment]) -> [Any] { return paymentList.map { v -> [String: Any?] in dictionaryOf(payment: v) } } static func asPrepareReceiveRequest(prepareReceiveRequest: [String: Any?]) throws -> PrepareReceiveRequest { guard let payerAmountSat = prepareReceiveRequest["payerAmountSat"] as? UInt64 else { throw LiquidSdkError.Generic(message: errMissingMandatoryField(fieldName: "payerAmountSat", typeName: "PrepareReceiveRequest")) } return PrepareReceiveRequest( payerAmountSat: payerAmountSat) } static func dictionaryOf(prepareReceiveRequest: PrepareReceiveRequest) -> [String: Any?] { return [ "payerAmountSat": prepareReceiveRequest.payerAmountSat, ] } static func asPrepareReceiveRequestList(arr: [Any]) throws -> [PrepareReceiveRequest] { var list = [PrepareReceiveRequest]() for value in arr { if let val = value as? [String: Any?] { var prepareReceiveRequest = try asPrepareReceiveRequest(prepareReceiveRequest: val) list.append(prepareReceiveRequest) } else { throw LiquidSdkError.Generic(message: errUnexpectedType(typeName: "PrepareReceiveRequest")) } } return list } static func arrayOf(prepareReceiveRequestList: [PrepareReceiveRequest]) -> [Any] { return prepareReceiveRequestList.map { v -> [String: Any?] in dictionaryOf(prepareReceiveRequest: v) } } static func asPrepareReceiveResponse(prepareReceiveResponse: [String: Any?]) throws -> PrepareReceiveResponse { guard let payerAmountSat = prepareReceiveResponse["payerAmountSat"] as? UInt64 else { throw LiquidSdkError.Generic(message: errMissingMandatoryField(fieldName: "payerAmountSat", typeName: "PrepareReceiveResponse")) } guard let feesSat = prepareReceiveResponse["feesSat"] as? UInt64 else { throw LiquidSdkError.Generic(message: errMissingMandatoryField(fieldName: "feesSat", typeName: "PrepareReceiveResponse")) } return PrepareReceiveResponse( payerAmountSat: payerAmountSat, feesSat: feesSat ) } static func dictionaryOf(prepareReceiveResponse: PrepareReceiveResponse) -> [String: Any?] { return [ "payerAmountSat": prepareReceiveResponse.payerAmountSat, "feesSat": prepareReceiveResponse.feesSat, ] } static func asPrepareReceiveResponseList(arr: [Any]) throws -> [PrepareReceiveResponse] { var list = [PrepareReceiveResponse]() for value in arr { if let val = value as? [String: Any?] { var prepareReceiveResponse = try asPrepareReceiveResponse(prepareReceiveResponse: val) list.append(prepareReceiveResponse) } else { throw LiquidSdkError.Generic(message: errUnexpectedType(typeName: "PrepareReceiveResponse")) } } return list } static func arrayOf(prepareReceiveResponseList: [PrepareReceiveResponse]) -> [Any] { return prepareReceiveResponseList.map { v -> [String: Any?] in dictionaryOf(prepareReceiveResponse: v) } } static func asPrepareSendRequest(prepareSendRequest: [String: Any?]) throws -> PrepareSendRequest { guard let invoice = prepareSendRequest["invoice"] as? String else { throw LiquidSdkError.Generic(message: errMissingMandatoryField(fieldName: "invoice", typeName: "PrepareSendRequest")) } return PrepareSendRequest( invoice: invoice) } static func dictionaryOf(prepareSendRequest: PrepareSendRequest) -> [String: Any?] { return [ "invoice": prepareSendRequest.invoice, ] } static func asPrepareSendRequestList(arr: [Any]) throws -> [PrepareSendRequest] { var list = [PrepareSendRequest]() for value in arr { if let val = value as? [String: Any?] { var prepareSendRequest = try asPrepareSendRequest(prepareSendRequest: val) list.append(prepareSendRequest) } else { throw LiquidSdkError.Generic(message: errUnexpectedType(typeName: "PrepareSendRequest")) } } return list } static func arrayOf(prepareSendRequestList: [PrepareSendRequest]) -> [Any] { return prepareSendRequestList.map { v -> [String: Any?] in dictionaryOf(prepareSendRequest: v) } } static func asPrepareSendResponse(prepareSendResponse: [String: Any?]) throws -> PrepareSendResponse { guard let invoice = prepareSendResponse["invoice"] as? String else { throw LiquidSdkError.Generic(message: errMissingMandatoryField(fieldName: "invoice", typeName: "PrepareSendResponse")) } guard let feesSat = prepareSendResponse["feesSat"] as? UInt64 else { throw LiquidSdkError.Generic(message: errMissingMandatoryField(fieldName: "feesSat", typeName: "PrepareSendResponse")) } return PrepareSendResponse( invoice: invoice, feesSat: feesSat ) } static func dictionaryOf(prepareSendResponse: PrepareSendResponse) -> [String: Any?] { return [ "invoice": prepareSendResponse.invoice, "feesSat": prepareSendResponse.feesSat, ] } static func asPrepareSendResponseList(arr: [Any]) throws -> [PrepareSendResponse] { var list = [PrepareSendResponse]() for value in arr { if let val = value as? [String: Any?] { var prepareSendResponse = try asPrepareSendResponse(prepareSendResponse: val) list.append(prepareSendResponse) } else { throw LiquidSdkError.Generic(message: errUnexpectedType(typeName: "PrepareSendResponse")) } } return list } static func arrayOf(prepareSendResponseList: [PrepareSendResponse]) -> [Any] { return prepareSendResponseList.map { v -> [String: Any?] in dictionaryOf(prepareSendResponse: v) } } static func asReceivePaymentResponse(receivePaymentResponse: [String: Any?]) throws -> ReceivePaymentResponse { guard let id = receivePaymentResponse["id"] as? String else { throw LiquidSdkError.Generic(message: errMissingMandatoryField(fieldName: "id", typeName: "ReceivePaymentResponse")) } guard let invoice = receivePaymentResponse["invoice"] as? String else { throw LiquidSdkError.Generic(message: errMissingMandatoryField(fieldName: "invoice", typeName: "ReceivePaymentResponse")) } return ReceivePaymentResponse( id: id, invoice: invoice ) } static func dictionaryOf(receivePaymentResponse: ReceivePaymentResponse) -> [String: Any?] { return [ "id": receivePaymentResponse.id, "invoice": receivePaymentResponse.invoice, ] } static func asReceivePaymentResponseList(arr: [Any]) throws -> [ReceivePaymentResponse] { var list = [ReceivePaymentResponse]() for value in arr { if let val = value as? [String: Any?] { var receivePaymentResponse = try asReceivePaymentResponse(receivePaymentResponse: val) list.append(receivePaymentResponse) } else { throw LiquidSdkError.Generic(message: errUnexpectedType(typeName: "ReceivePaymentResponse")) } } return list } static func arrayOf(receivePaymentResponseList: [ReceivePaymentResponse]) -> [Any] { return receivePaymentResponseList.map { v -> [String: Any?] in dictionaryOf(receivePaymentResponse: v) } } static func asRestoreRequest(restoreRequest: [String: Any?]) throws -> RestoreRequest { var backupPath: String? if hasNonNilKey(data: restoreRequest, key: "backupPath") { guard let backupPathTmp = restoreRequest["backupPath"] as? String else { throw LiquidSdkError.Generic(message: errUnexpectedValue(fieldName: "backupPath")) } backupPath = backupPathTmp } return RestoreRequest( backupPath: backupPath) } static func dictionaryOf(restoreRequest: RestoreRequest) -> [String: Any?] { return [ "backupPath": restoreRequest.backupPath == nil ? nil : restoreRequest.backupPath, ] } static func asRestoreRequestList(arr: [Any]) throws -> [RestoreRequest] { var list = [RestoreRequest]() for value in arr { if let val = value as? [String: Any?] { var restoreRequest = try asRestoreRequest(restoreRequest: val) list.append(restoreRequest) } else { throw LiquidSdkError.Generic(message: errUnexpectedType(typeName: "RestoreRequest")) } } return list } static func arrayOf(restoreRequestList: [RestoreRequest]) -> [Any] { return restoreRequestList.map { v -> [String: Any?] in dictionaryOf(restoreRequest: v) } } static func asSendPaymentResponse(sendPaymentResponse: [String: Any?]) throws -> SendPaymentResponse { guard let txid = sendPaymentResponse["txid"] as? String else { throw LiquidSdkError.Generic(message: errMissingMandatoryField(fieldName: "txid", typeName: "SendPaymentResponse")) } return SendPaymentResponse( txid: txid) } static func dictionaryOf(sendPaymentResponse: SendPaymentResponse) -> [String: Any?] { return [ "txid": sendPaymentResponse.txid, ] } static func asSendPaymentResponseList(arr: [Any]) throws -> [SendPaymentResponse] { var list = [SendPaymentResponse]() for value in arr { if let val = value as? [String: Any?] { var sendPaymentResponse = try asSendPaymentResponse(sendPaymentResponse: val) list.append(sendPaymentResponse) } else { throw LiquidSdkError.Generic(message: errUnexpectedType(typeName: "SendPaymentResponse")) } } return list } static func arrayOf(sendPaymentResponseList: [SendPaymentResponse]) -> [Any] { return sendPaymentResponseList.map { v -> [String: Any?] in dictionaryOf(sendPaymentResponse: v) } } static func asNetwork(network: String) throws -> Network { switch network { case "liquid": return Network.liquid case "liquidTestnet": return Network.liquidTestnet default: throw LiquidSdkError.Generic(message: "Invalid variant \(network) for enum Network") } } static func valueOf(network: Network) -> String { switch network { case .liquid: return "liquid" case .liquidTestnet: return "liquidTestnet" } } static func arrayOf(networkList: [Network]) -> [String] { return networkList.map { v -> String in valueOf(network: v) } } static func asNetworkList(arr: [Any]) throws -> [Network] { var list = [Network]() for value in arr { if let val = value as? String { var network = try asNetwork(network: val) list.append(network) } else { throw LiquidSdkError.Generic(message: errUnexpectedType(typeName: "Network")) } } return list } static func asPaymentState(paymentState: String) throws -> PaymentState { switch paymentState { case "created": return PaymentState.created case "pending": return PaymentState.pending case "complete": return PaymentState.complete case "failed": return PaymentState.failed default: throw LiquidSdkError.Generic(message: "Invalid variant \(paymentState) for enum PaymentState") } } static func valueOf(paymentState: PaymentState) -> String { switch paymentState { case .created: return "created" case .pending: return "pending" case .complete: return "complete" case .failed: return "failed" } } static func arrayOf(paymentStateList: [PaymentState]) -> [String] { return paymentStateList.map { v -> String in valueOf(paymentState: v) } } static func asPaymentStateList(arr: [Any]) throws -> [PaymentState] { var list = [PaymentState]() for value in arr { if let val = value as? String { var paymentState = try asPaymentState(paymentState: val) list.append(paymentState) } else { throw LiquidSdkError.Generic(message: errUnexpectedType(typeName: "PaymentState")) } } return list } static func asPaymentType(paymentType: String) throws -> PaymentType { switch paymentType { case "receive": return PaymentType.receive case "send": return PaymentType.send default: throw LiquidSdkError.Generic(message: "Invalid variant \(paymentType) for enum PaymentType") } } static func valueOf(paymentType: PaymentType) -> String { switch paymentType { case .receive: return "receive" case .send: return "send" } } static func arrayOf(paymentTypeList: [PaymentType]) -> [String] { return paymentTypeList.map { v -> String in valueOf(paymentType: v) } } static func asPaymentTypeList(arr: [Any]) throws -> [PaymentType] { var list = [PaymentType]() for value in arr { if let val = value as? String { var paymentType = try asPaymentType(paymentType: val) list.append(paymentType) } else { throw LiquidSdkError.Generic(message: errUnexpectedType(typeName: "PaymentType")) } } return list } static func hasNonNilKey(data: [String: Any?], key: String) -> Bool { if let val = data[key] { return !(val == nil || val is NSNull) } return false } static func errMissingMandatoryField(fieldName: String, typeName: String) -> String { return "Missing mandatory field \(fieldName) for type \(typeName)" } static func errUnexpectedType(typeName: String) -> String { return "Unexpected type \(typeName)" } static func errUnexpectedValue(fieldName: String) -> String { return "Unexpected value for optional field \(fieldName)" } }