From eeb81ba1fbcdf1ee337892ffeeaff580b2aa7304 Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Tue, 30 Aug 2022 00:52:11 +0100
Subject: [PATCH] Add converJsonNumberToString function

---
 .../Helpers/ConvertJsonNumberToString.swift   | 19 +++++
 .../ConvertJsonNumberToStringTests.swift      | 84 +++++++++++++++++++
 2 files changed, 103 insertions(+)
 create mode 100644 Sources/XXClient/Helpers/ConvertJsonNumberToString.swift
 create mode 100644 Tests/XXClientTests/Helpers/ConvertJsonNumberToStringTests.swift

diff --git a/Sources/XXClient/Helpers/ConvertJsonNumberToString.swift b/Sources/XXClient/Helpers/ConvertJsonNumberToString.swift
new file mode 100644
index 00000000..293f1ca6
--- /dev/null
+++ b/Sources/XXClient/Helpers/ConvertJsonNumberToString.swift
@@ -0,0 +1,19 @@
+import Foundation
+
+func convertJsonNumberToString(
+  in input: Data,
+  at key: String
+) -> Data {
+  guard var string = String(data: input, encoding: .utf8) else {
+    return input
+  }
+  string = string.replacingOccurrences(
+    of: #""\#(key)"( *):( *)([0-9]+)( *)(,*)"#,
+    with: #""\#(key)"$1:$2"$3"$4$5"#,
+    options: [.regularExpression]
+  )
+  guard let output = string.data(using: .utf8) else {
+    return input
+  }
+  return output
+}
diff --git a/Tests/XXClientTests/Helpers/ConvertJsonNumberToStringTests.swift b/Tests/XXClientTests/Helpers/ConvertJsonNumberToStringTests.swift
new file mode 100644
index 00000000..db3a4b2e
--- /dev/null
+++ b/Tests/XXClientTests/Helpers/ConvertJsonNumberToStringTests.swift
@@ -0,0 +1,84 @@
+import CustomDump
+import XCTest
+@testable import XXClient
+
+final class ConvertJsonNumberToStringTests: XCTestCase {
+  func testConverting() {
+    assert(
+      input: #"{"number":1234567890,"text":"hello"}"#,
+      key: "number",
+      expected: #"{"number":"1234567890","text":"hello"}"#
+    )
+
+    assert(
+      input: #"{"text":"hello","number":1234567890}"#,
+      key: "number",
+      expected: #"{"text":"hello","number":"1234567890"}"#
+    )
+
+    assert(
+      input: #"{  "number"  :  1234567890  ,  "text"  :  "hello"  }"#,
+      key: "number",
+      expected: #"{  "number"  :  "1234567890"  ,  "text"  :  "hello"  }"#
+    )
+
+    assert(
+      input: #"{  "text"  :  "hello"  ,  "number"  :  1234567890  }"#,
+      key: "number",
+      expected: #"{  "text"  :  "hello"  ,  "number"  :  "1234567890"  }"#
+    )
+
+    assert(
+      input: """
+      {
+        "number": 1234567890,
+        "text": "hello"
+      }
+      """,
+      key: "number",
+      expected: """
+      {
+        "number": "1234567890",
+        "text": "hello"
+      }
+      """
+    )
+
+    assert(
+      input: """
+      {
+        "text": "hello",
+        "number": 1234567890
+      }
+      """,
+      key: "number",
+      expected: """
+      {
+        "text": "hello",
+        "number": "1234567890"
+      }
+      """
+    )
+  }
+}
+
+private func assert(
+  input: String,
+  key: String,
+  expected: String,
+  file: StaticString = #file,
+  line: UInt = #line
+) {
+  XCTAssertNoDifference(
+    String(
+      data: convertJsonNumberToString(
+        in: input.data(using: .utf8)!,
+        at: key
+      ),
+      encoding: .utf8
+    )!,
+    expected,
+    file: file,
+    line: line
+  )
+}
-- 
GitLab