From 6c31fc64c16b7c2a8219cb3ddde41ff505e175eb Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Wed, 7 Sep 2022 16:24:09 +0200
Subject: [PATCH] Encode/decode empty facts array to/from "null"

---
 Sources/XXClient/Models/Fact.swift         | 10 ++++++++--
 Tests/XXClientTests/Models/FactTests.swift | 13 +++++++++++++
 2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/Sources/XXClient/Models/Fact.swift b/Sources/XXClient/Models/Fact.swift
index 99db6a2a..2ee8a6b3 100644
--- a/Sources/XXClient/Models/Fact.swift
+++ b/Sources/XXClient/Models/Fact.swift
@@ -30,10 +30,16 @@ extension Fact: Codable {
 
 extension Array where Element == Fact {
   public static func decode(_ data: Data) throws -> Self {
-    try JSONDecoder().decode(Self.self, from: data)
+    if let string = String(data: data, encoding: .utf8), string == "null" {
+      return []
+    }
+    return try JSONDecoder().decode(Self.self, from: data)
   }
 
   public func encode() throws -> Data {
-    try JSONEncoder().encode(self)
+    if isEmpty {
+      return "null".data(using: .utf8)!
+    }
+    return try JSONEncoder().encode(self)
   }
 }
diff --git a/Tests/XXClientTests/Models/FactTests.swift b/Tests/XXClientTests/Models/FactTests.swift
index 2ba1da9a..c844af66 100644
--- a/Tests/XXClientTests/Models/FactTests.swift
+++ b/Tests/XXClientTests/Models/FactTests.swift
@@ -38,4 +38,17 @@ final class FactTests: XCTestCase {
 
     XCTAssertNoDifference(models, decodedModels)
   }
+
+  func testCodingEmptyArray() throws {
+    let jsonString = "null"
+    let jsonData = jsonString.data(using: .utf8)!
+
+    let decodedModels = try [Fact].decode(jsonData)
+
+    XCTAssertNoDifference(decodedModels, [])
+
+    let encodedModels = try decodedModels.encode()
+
+    XCTAssertNoDifference(encodedModels, jsonData)
+  }
 }
-- 
GitLab