From a44341bb6b4ec4469359e1a7ff6711a92b36d50b Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Thu, 2 Jun 2022 10:24:27 +0200
Subject: [PATCH] Add NetworkFollower with status and starter

---
 Sources/ElixxirDAppsSDK/Client.swift          | 10 +++++--
 Sources/ElixxirDAppsSDK/NetworkFollower.swift | 24 +++++++++++++++
 .../NetworkFollowerStarter.swift              | 26 +++++++++++++++++
 .../NetworkFollowerStatus.swift               | 29 +++++++++++++++++++
 .../NetworkFollowerStatusProvider.swift       | 26 +++++++++++++++++
 5 files changed, 112 insertions(+), 3 deletions(-)
 create mode 100644 Sources/ElixxirDAppsSDK/NetworkFollower.swift
 create mode 100644 Sources/ElixxirDAppsSDK/NetworkFollowerStarter.swift
 create mode 100644 Sources/ElixxirDAppsSDK/NetworkFollowerStatus.swift
 create mode 100644 Sources/ElixxirDAppsSDK/NetworkFollowerStatusProvider.swift

diff --git a/Sources/ElixxirDAppsSDK/Client.swift b/Sources/ElixxirDAppsSDK/Client.swift
index 49a97094..47f4b2ef 100644
--- a/Sources/ElixxirDAppsSDK/Client.swift
+++ b/Sources/ElixxirDAppsSDK/Client.swift
@@ -1,17 +1,21 @@
 import Bindings
 
 public struct Client {
-
+  public var networkFollower: NetworkFollower
 }
 
 extension Client {
   public static func live(bindingsClient: BindingsClient) -> Client {
-    Client()
+    Client(
+      networkFollower: .live(bindingsClient: bindingsClient)
+    )
   }
 }
 
 #if DEBUG
 extension Client {
-  public static let failing = Client()
+  public static let failing = Client(
+    networkFollower: .failing
+  )
 }
 #endif
diff --git a/Sources/ElixxirDAppsSDK/NetworkFollower.swift b/Sources/ElixxirDAppsSDK/NetworkFollower.swift
new file mode 100644
index 00000000..31dab090
--- /dev/null
+++ b/Sources/ElixxirDAppsSDK/NetworkFollower.swift
@@ -0,0 +1,24 @@
+import Bindings
+
+public struct NetworkFollower {
+  public var status: NetworkFollowerStatusProvider
+  public var start: NetworkFollowerStarter
+}
+
+extension NetworkFollower {
+  public static func live(bindingsClient: BindingsClient) -> NetworkFollower {
+    NetworkFollower(
+      status: .live(bindingsClient: bindingsClient),
+      start: .live(bindingsClient: bindingsClient)
+    )
+  }
+}
+
+#if DEBUG
+extension NetworkFollower {
+  public static let failing = NetworkFollower(
+    status: .failing,
+    start: .failing
+  )
+}
+#endif
diff --git a/Sources/ElixxirDAppsSDK/NetworkFollowerStarter.swift b/Sources/ElixxirDAppsSDK/NetworkFollowerStarter.swift
new file mode 100644
index 00000000..54b8c237
--- /dev/null
+++ b/Sources/ElixxirDAppsSDK/NetworkFollowerStarter.swift
@@ -0,0 +1,26 @@
+import Bindings
+
+public struct NetworkFollowerStarter {
+  public var start: (_ timeoutMS: Int) throws -> Void
+
+  public func callAsFunction(timeoutMS: Int) throws {
+    try start(timeoutMS)
+  }
+}
+
+extension NetworkFollowerStarter {
+  public static func live(bindingsClient: BindingsClient) -> NetworkFollowerStarter {
+    NetworkFollowerStarter { timeoutMS in
+      try bindingsClient.startNetworkFollower(timeoutMS)
+    }
+  }
+}
+
+#if DEBUG
+extension NetworkFollowerStarter {
+  public static let failing = NetworkFollowerStarter { _ in
+    struct NotImplemented: Error {}
+    throw NotImplemented()
+  }
+}
+#endif
diff --git a/Sources/ElixxirDAppsSDK/NetworkFollowerStatus.swift b/Sources/ElixxirDAppsSDK/NetworkFollowerStatus.swift
new file mode 100644
index 00000000..8630aafe
--- /dev/null
+++ b/Sources/ElixxirDAppsSDK/NetworkFollowerStatus.swift
@@ -0,0 +1,29 @@
+public enum NetworkFollowerStatus: Equatable {
+  case stopped
+  case starting
+  case running
+  case stopping
+  case unknown(code: Int)
+}
+
+extension NetworkFollowerStatus {
+  public init(rawValue: Int) {
+    switch rawValue {
+    case 0: self = .stopped
+    case 1_000: self = .starting
+    case 2_000: self = .running
+    case 3_000: self = .stopping
+    case let code: self = .unknown(code: code)
+    }
+  }
+
+  public var rawValue: Int {
+    switch self {
+    case .stopped: return 0
+    case .starting: return 1_000
+    case .running: return 2_000
+    case .stopping: return 3_000
+    case .unknown(let code): return code
+    }
+  }
+}
diff --git a/Sources/ElixxirDAppsSDK/NetworkFollowerStatusProvider.swift b/Sources/ElixxirDAppsSDK/NetworkFollowerStatusProvider.swift
new file mode 100644
index 00000000..ee8d5cc3
--- /dev/null
+++ b/Sources/ElixxirDAppsSDK/NetworkFollowerStatusProvider.swift
@@ -0,0 +1,26 @@
+import Bindings
+
+public struct NetworkFollowerStatusProvider {
+  public var status: () -> NetworkFollowerStatus
+
+  public func callAsFunction() -> NetworkFollowerStatus {
+    status()
+  }
+}
+
+extension NetworkFollowerStatusProvider {
+  public static func live(bindingsClient: BindingsClient) -> NetworkFollowerStatusProvider {
+    NetworkFollowerStatusProvider {
+      let rawValue = bindingsClient.networkFollowerStatus()
+      return NetworkFollowerStatus(rawValue: rawValue)
+    }
+  }
+}
+
+#if DEBUG
+extension NetworkFollowerStatusProvider {
+  public static let failing = NetworkFollowerStatusProvider {
+    .unknown(code: -1)
+  }
+}
+#endif
-- 
GitLab