From 7848256732119aec87d6c08e907d05bf21f0b9e1 Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Wed, 1 Jun 2022 11:55:28 +0200
Subject: [PATCH] Add ClientLoader

---
 Sources/ElixxirDAppsSDK/ClientLoader.swift | 30 ++++++++++++++++++++++
 Sources/ElixxirDAppsSDK/Errors.swift       |  4 +++
 2 files changed, 34 insertions(+)
 create mode 100644 Sources/ElixxirDAppsSDK/ClientLoader.swift

diff --git a/Sources/ElixxirDAppsSDK/ClientLoader.swift b/Sources/ElixxirDAppsSDK/ClientLoader.swift
new file mode 100644
index 00000000..632f0107
--- /dev/null
+++ b/Sources/ElixxirDAppsSDK/ClientLoader.swift
@@ -0,0 +1,30 @@
+import Bindings
+
+public struct ClientLoader {
+  public var load: (URL, Data) throws -> Client
+
+  public func callAsFunction(directoryURL: URL, password: Data) throws -> Client {
+    try load(directoryURL, password)
+  }
+}
+
+extension ClientLoader {
+  public static let live = ClientLoader { directoryURL, password in
+    var error: NSError?
+    let bindingsClient = BindingsLogin(directoryURL.path, password, &error)
+    if let error = error { throw error }
+    guard let bindingsClient = bindingsClient else {
+      throw BindingsLoginUnknownError()
+    }
+    return Client.live(bindingsClient: bindingsClient)
+  }
+}
+
+#if DEBUG
+extension ClientLoader {
+  public static let failing = ClientLoader { _, _ in
+    struct NotImplemented: Error {}
+    throw NotImplemented()
+  }
+}
+#endif
diff --git a/Sources/ElixxirDAppsSDK/Errors.swift b/Sources/ElixxirDAppsSDK/Errors.swift
index 94f93f98..d28f5baf 100644
--- a/Sources/ElixxirDAppsSDK/Errors.swift
+++ b/Sources/ElixxirDAppsSDK/Errors.swift
@@ -13,3 +13,7 @@ public struct PasswordStorageMissingPasswordError: Error, Equatable {
 public struct BindingsNewClientUnknownError: Error, Equatable {
   public init() {}
 }
+
+public struct BindingsLoginUnknownError: Error, Equatable {
+  public init() {}
+}
-- 
GitLab