diff --git a/Sources/XXClient/Callbacks/UdSearchCallback.swift b/Sources/XXClient/Callbacks/UdSearchCallback.swift index 252c6546db98064a3ee0ca5a15da6319d3d0b6bf..87b00e0f889dbf0a27de8fb5213d45c4eb423ead 100644 --- a/Sources/XXClient/Callbacks/UdSearchCallback.swift +++ b/Sources/XXClient/Callbacks/UdSearchCallback.swift @@ -29,7 +29,15 @@ extension UdSearchCallback { callback.handle(.failure(error as NSError)) } else if let data = contactListJSON { do { - callback.handle(.success(try [UDSearchResult].decode(data))) + let contacts = try JSONDecoder().decode([Data].self, from: data) + let results = try contacts.map { contact in + UDSearchResult( + id: try GetIdFromContact.live(contact), + publicKey: try GetPublicKeyFromContact.live(contact: contact), + facts: try GetFactsFromContact.live(contact: contact) + ) + } + callback.handle(.success(results)) } catch { callback.handle(.failure(error as NSError)) } diff --git a/Sources/XXClient/Models/UDSearchResult.swift b/Sources/XXClient/Models/UDSearchResult.swift index 84bdcccd8fb354cc2a6aa81368d4eae5f5efc961..ecc1c3207ab2346d8bfe55f1a09e88722a7816b0 100644 --- a/Sources/XXClient/Models/UDSearchResult.swift +++ b/Sources/XXClient/Models/UDSearchResult.swift @@ -3,54 +3,15 @@ import Foundation public struct UDSearchResult: Equatable { public init( id: Data, + publicKey: Data, facts: [Fact] ) { self.id = id + self.publicKey = publicKey self.facts = facts } public var id: Data + public var publicKey: Data public var facts: [Fact] } - -extension UDSearchResult: Codable { - enum CodingKeys: String, CodingKey { - case id = "ID" - case facts = "Facts" - } - - public static func decode(_ data: Data) throws -> Self { - let data = convertBigIntsToStrings(jsonData: data) - return try JSONDecoder().decode(Self.self, from: data) - } - - public func encode() throws -> Data { - try JSONEncoder().encode(self) - } -} - -extension Array where Element == UDSearchResult { - public static func decode(_ data: Data) throws -> Self { - let data = convertBigIntsToStrings(jsonData: data) - return try JSONDecoder().decode(Self.self, from: data) - } - - public func encode() throws -> Data { - try JSONEncoder().encode(self) - } -} - -private func convertBigIntsToStrings(jsonData input: Data) -> Data { - guard var string = String(data: input, encoding: .utf8) else { - return input - } - string = string.replacingOccurrences( - of: #":\s*([0-9]{19,})\s*,"#, - with: #": "$1","#, - options: [.regularExpression] - ) - guard let output = string.data(using: .utf8) else { - return input - } - return output -} diff --git a/Tests/XXClientTests/Models/UDSearchResultTests.swift b/Tests/XXClientTests/Models/UDSearchResultTests.swift deleted file mode 100644 index 1ac94da20704d7341b862d9155c6af319da244f4..0000000000000000000000000000000000000000 --- a/Tests/XXClientTests/Models/UDSearchResultTests.swift +++ /dev/null @@ -1,71 +0,0 @@ -import CustomDump -import XCTest -@testable import XXClient - -final class UDSearchResultTests: XCTestCase { - func testCoding() throws { - let idB64 = "pYIpRwPy+FnOkl5tndkG8RC93W/t5b1lszqPpMDynlUD" - let facts: [Fact] = [ - Fact(fact: "carlos_arimateias", type: 0), - ] - let jsonString = """ - { - "ID": "\(idB64)", - "Facts": \(String(data: try! facts.encode(), encoding: .utf8)!) - } - """ - let jsonData = jsonString.data(using: .utf8)! - let model = try UDSearchResult.decode(jsonData) - - XCTAssertNoDifference(model, UDSearchResult( - id: Data(base64Encoded: idB64)!, - facts: facts - )) - - let encodedModel = try model.encode() - let decodedModel = try UDSearchResult.decode(encodedModel) - - XCTAssertNoDifference(decodedModel, model) - } - - func testCodingArray() throws { - let models: [UDSearchResult] = [ - UDSearchResult( - id: Data(base64Encoded: "pYIpRwPy+FnOkl5tndkG8RC93W/t5b1lszqPpMDynlUD")!, - facts: [ - Fact(fact: "carlos_arimateias", type: 0), - ] - ), - ] - let encodedModels = try models.encode() - let decodedModels = try [UDSearchResult].decode(encodedModels) - - XCTAssertNoDifference(decodedModels, models) - } - - func testEncodeWithBigInt() throws { - let idB64 = "pYIpRwPy+FnOkl5tndkG8RC93W/t5b1lszqPpMDynlUD" - let facts: [Fact] = [ - Fact(fact: "carlos_arimateias", type: 0), - ] - let jsonString = """ - { - "ID": "\(idB64)", - "DhPubKey": { - "Value": 1759426033802606996617132861414734059978289057332806031357800676138355264622676606691435603603751978195460163638145821347601916259127578968570412642641025630452893097179266022832268525346700655861033031712000288680395716922501450233258587788020541937373196899001184700899008948530359980753630443486308876999029238453979779103124291315202352475056237021681172884599194016245219278368648568458514708567045834427853469072638665888791358582182353417065794210125797368093469194927663862565508608719835557592421245749381164023134450699040591219966988201315627676532245052123725278573237006510683695959381015415110970848376498637637944431576313526294020390694483472829278364602405292767170719547347485307956614210210673321959886410245334772057212077704024337636501108566655549055129066343309591274727538343075929837698653965640646190405582788894021694347212874155979958144038307500444865955516612526623220973497735316081265793063949, - "Fingerprint": 15989433043166758754 - }, - "OwnershipProof": null, - "Facts": \(String(data: try! facts.encode(), encoding: .utf8)!) - } - """ - let jsonData = jsonString.data(using: .utf8)! - - let decodedModel = try UDSearchResult.decode(jsonData) - - XCTAssertNoDifference(decodedModel, UDSearchResult( - id: Data(base64Encoded: idB64)!, - facts: facts - )) - } -}