From 6079b4decc44306931f99ddc7de83c8a1c468a5d Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Thu, 28 Jul 2022 20:46:33 +0100 Subject: [PATCH] Add FileTransferProgressCallback --- .../FileTransferProgressCallback.swift | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 Sources/ElixxirDAppsSDK/Callbacks/FileTransferProgressCallback.swift diff --git a/Sources/ElixxirDAppsSDK/Callbacks/FileTransferProgressCallback.swift b/Sources/ElixxirDAppsSDK/Callbacks/FileTransferProgressCallback.swift new file mode 100644 index 00000000..faf5a700 --- /dev/null +++ b/Sources/ElixxirDAppsSDK/Callbacks/FileTransferProgressCallback.swift @@ -0,0 +1,69 @@ +import Bindings +import XCTestDynamicOverlay + +public struct FileTransferProgressCallback { + public struct Callback { + public var progress: Progress + public var partTracker: FilePartTracker + } + + public init(handle: @escaping (Result<Callback, NSError>) -> Void) { + self.handle = handle + } + + public var handle: (Result<Callback, NSError>) -> Void +} + +extension FileTransferProgressCallback { + public static let unimplemented = FileTransferProgressCallback( + handle: XCTUnimplemented("\(Self.self)") + ) +} + +extension FileTransferProgressCallback { + func makeBindingsFileTransferReceiveProgressCallback() -> BindingsFileTransferReceiveProgressCallbackProtocol { + makeBindingsFileTransferProgressCallback(debugName: "BindingsFileTransferReceiveProgressCallback") + } + + func makeBindingsFileTransferSentProgressCallback() -> BindingsFileTransferSentProgressCallbackProtocol { + makeBindingsFileTransferProgressCallback(debugName: "BindingsFileTransferSentProgressCallback") + } + + private func makeBindingsFileTransferProgressCallback(debugName: String) + -> BindingsFileTransferReceiveProgressCallbackProtocol & BindingsFileTransferSentProgressCallbackProtocol { + class CallbackObject: NSObject, + BindingsFileTransferReceiveProgressCallbackProtocol, + BindingsFileTransferSentProgressCallbackProtocol { + init(_ callback: FileTransferProgressCallback, _ debugName: String) { + self.callback = callback + self.debugName = debugName + } + + let callback: FileTransferProgressCallback + let debugName: String + + func callback(_ payload: Data?, t: BindingsFilePartTracker?, err: Error?) { + if let error = err { + callback.handle(.failure(error as NSError)) + return + } + guard let payload = payload else { + fatalError("\(debugName) received `nil` payload without providing error") + } + guard let tracker = t else { + fatalError("\(debugName) received `nil` tracker without providing error") + } + do { + callback.handle(.success(.init( + progress: try Progress.decode(payload), + partTracker: .live(tracker) + ))) + } catch { + callback.handle(.failure(error as NSError)) + } + } + } + + return CallbackObject(self, debugName) + } +} -- GitLab