diff --git a/Sources/XXClient/Callbacks/UdMultiLookupCallback.swift b/Sources/XXClient/Callbacks/UdMultiLookupCallback.swift new file mode 100644 index 0000000000000000000000000000000000000000..9a6d9df64e56f28edc072449bc0dac5be7de6aa4 --- /dev/null +++ b/Sources/XXClient/Callbacks/UdMultiLookupCallback.swift @@ -0,0 +1,55 @@ +import Bindings +import XCTestDynamicOverlay + +public struct UdMultiLookupCallback { + public enum Result: Equatable { + case success([Contact]) + case failure(error: NSError, failedIDs: [Data]) + } + + public init(handle: @escaping (Result) -> Void) { + self.handle = handle + } + + public var handle: (Result) -> Void +} + +extension UdMultiLookupCallback { + public static let unimplemented = UdMultiLookupCallback( + handle: XCTUnimplemented("\(Self.self)") + ) +} + +extension UdMultiLookupCallback { + func makeBindingsUdMultiLookupCallback() -> BindingsUdMultiLookupCallbackProtocol { + class CallbackObject: NSObject, BindingsUdMultiLookupCallbackProtocol { + init(_ callback: UdMultiLookupCallback) { + self.callback = callback + } + + let callback: UdMultiLookupCallback + + func callback(_ contactListJSON: Data?, failedIDs: Data?, err: Error?) { + if let err = err { + callback.handle(.failure( + error: err as NSError, + failedIDs: failedIDs + .map { (try? JSONDecoder().decode([Data].self, from: $0)) ?? [] } ?? [] + )) + } else if let contactListJSON = contactListJSON { + do { + let contactsData = try JSONDecoder().decode([Data].self, from: contactListJSON) + let contacts: [Contact] = contactsData.map { Contact.live($0) } + callback.handle(.success(contacts)) + } catch { + callback.handle(.failure(error: error as NSError, failedIDs: [])) + } + } else { + fatalError("BindingsUdMultiLookupCallbackProtocol received `nil` contactListJSON and `nil` error") + } + } + } + + return CallbackObject(self) + } +}