From 6a4c64eebb3fe93fe011a4ae7414533ecd80431b Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Wed, 7 Sep 2022 23:50:23 +0200
Subject: [PATCH] Add FactType model

---
 Sources/XXClient/Models/FactType.swift        | 39 ++++++++++++++++
 .../XXClientTests/Models/FactTypeTests.swift  | 44 +++++++++++++++++++
 2 files changed, 83 insertions(+)
 create mode 100644 Sources/XXClient/Models/FactType.swift
 create mode 100644 Tests/XXClientTests/Models/FactTypeTests.swift

diff --git a/Sources/XXClient/Models/FactType.swift b/Sources/XXClient/Models/FactType.swift
new file mode 100644
index 00000000..96caa0ff
--- /dev/null
+++ b/Sources/XXClient/Models/FactType.swift
@@ -0,0 +1,39 @@
+import Foundation
+
+public enum FactType: Equatable {
+  case username
+  case email
+  case phone
+  case other(Int)
+
+  public static let knownTypes: [FactType] = [.username, .email, .phone]
+
+  public init(rawValue: Int) {
+    if let known = FactType.knownTypes.first(where: { $0.rawValue == rawValue }) {
+      self = known
+    } else {
+      self = .other(rawValue)
+    }
+  }
+
+  public var rawValue: Int {
+    switch self {
+    case .username: return 0
+    case .email: return 1
+    case .phone: return 2
+    case .other(let rawValue): return rawValue
+    }
+  }
+}
+
+extension FactType: Codable {
+  public init(from decoder: Decoder) throws {
+    let container = try decoder.singleValueContainer()
+    self.init(rawValue: try container.decode(Int.self))
+  }
+
+  public func encode(to encoder: Encoder) throws {
+    var container = encoder.singleValueContainer()
+    try container.encode(rawValue)
+  }
+}
diff --git a/Tests/XXClientTests/Models/FactTypeTests.swift b/Tests/XXClientTests/Models/FactTypeTests.swift
new file mode 100644
index 00000000..f8c3347b
--- /dev/null
+++ b/Tests/XXClientTests/Models/FactTypeTests.swift
@@ -0,0 +1,44 @@
+import CustomDump
+import Foundation
+import XCTest
+@testable import XXClient
+
+final class FactTypeTests: XCTestCase {
+  func testDecoding() throws {
+    let decoder = Foundation.JSONDecoder()
+
+    XCTAssertNoDifference(
+      [
+        try decoder.decode(FactType.self, from: "0".data(using: .utf8)!),
+        try decoder.decode(FactType.self, from: "1".data(using: .utf8)!),
+        try decoder.decode(FactType.self, from: "2".data(using: .utf8)!),
+        try decoder.decode(FactType.self, from: "3".data(using: .utf8)!),
+      ],
+      [
+        FactType.username,
+        FactType.email,
+        FactType.phone,
+        FactType.other(3),
+      ]
+    )
+  }
+
+  func testEncoding() throws {
+    let encoder = Foundation.JSONEncoder()
+
+    XCTAssertNoDifference(
+      [
+        try encoder.encode(FactType.username),
+        try encoder.encode(FactType.email),
+        try encoder.encode(FactType.phone),
+        try encoder.encode(FactType.other(3)),
+      ],
+      [
+        "0".data(using: .utf8)!,
+        "1".data(using: .utf8)!,
+        "2".data(using: .utf8)!,
+        "3".data(using: .utf8)!,
+      ]
+    )
+  }
+}
-- 
GitLab