From d5bd13ea67b8bdd8e3edfe102d179d358ddc428c Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Thu, 28 Jul 2022 19:40:29 +0100 Subject: [PATCH] Add SingleUseCallback --- .../Callbacks/SingleUseCallback.swift | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 Sources/ElixxirDAppsSDK/Callbacks/SingleUseCallback.swift diff --git a/Sources/ElixxirDAppsSDK/Callbacks/SingleUseCallback.swift b/Sources/ElixxirDAppsSDK/Callbacks/SingleUseCallback.swift new file mode 100644 index 00000000..99a4cf1f --- /dev/null +++ b/Sources/ElixxirDAppsSDK/Callbacks/SingleUseCallback.swift @@ -0,0 +1,44 @@ +import Bindings +import XCTestDynamicOverlay + +public struct SingleUseCallback { + public init(handle: @escaping (Result<SingleUseCallbackReport, NSError>) -> Void) { + self.handle = handle + } + + public var handle: (Result<SingleUseCallbackReport, NSError>) -> Void +} + +extension SingleUseCallback { + public static let unimplemented = SingleUseCallback( + handle: XCTUnimplemented("\(Self.self)") + ) +} + +extension SingleUseCallback { + func makeBindingsSingleUseCallback() -> BindingsSingleUseCallbackProtocol { + class CallbackObject: NSObject, BindingsSingleUseCallbackProtocol { + init(_ callback: SingleUseCallback) { + self.callback = callback + } + + let callback: SingleUseCallback + + func callback(_ callbackReport: Data?, err: Error?) { + if let error = err { + callback.handle(.failure(error as NSError)) + } else if let callbackReport = callbackReport { + do { + callback.handle(.success(try SingleUseCallbackReport.decode(callbackReport))) + } catch { + callback.handle(.failure(error as NSError)) + } + } else { + fatalError("BindingsSingleUseCallback received `nil` callbackReport and `nil` error") + } + } + } + + return CallbackObject(self) + } +} -- GitLab