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