diff --git a/Sources/ElixxirDAppsSDK/MessageSendReport.swift b/Sources/ElixxirDAppsSDK/MessageSendReport.swift new file mode 100644 index 0000000000000000000000000000000000000000..687fc08d83d38b215b27a4a804134c19f99d8505 --- /dev/null +++ b/Sources/ElixxirDAppsSDK/MessageSendReport.swift @@ -0,0 +1,51 @@ +import Foundation + +public struct MessageSendReport: Equatable { + public init( + roundList: [Int], + messageId: Data, + timestamp: Int + ) { + self.roundList = roundList + self.messageId = messageId + self.timestamp = timestamp + } + + public var roundList: [Int] + public var messageId: Data + public var timestamp: Int +} + +extension MessageSendReport: Codable { + enum CodingKeys: String, CodingKey { + case roundList = "RoundList" + case messageId = "MessageID" + case timestamp = "Timestamp" + } + + enum RoundListCodingKeys: String, CodingKey { + case rounds = "Rounds" + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + messageId = try container.decode(Data.self, forKey: .messageId) + timestamp = try container.decode(Int.self, forKey: .timestamp) + let roundListContainer = try container.nestedContainer( + keyedBy: RoundListCodingKeys.self, + forKey: .roundList + ) + roundList = try roundListContainer.decode([Int].self, forKey: .rounds) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(messageId, forKey: .messageId) + try container.encode(timestamp, forKey: .timestamp) + var roundListContainer = container.nestedContainer( + keyedBy: RoundListCodingKeys.self, + forKey: .roundList + ) + try roundListContainer.encode(roundList, forKey: .rounds) + } +} diff --git a/Tests/ElixxirDAppsSDKTests/MessageSendReportTests.swift b/Tests/ElixxirDAppsSDKTests/MessageSendReportTests.swift new file mode 100644 index 0000000000000000000000000000000000000000..9adb1f2b995d40ec166418dcc2872393b53be2f3 --- /dev/null +++ b/Tests/ElixxirDAppsSDKTests/MessageSendReportTests.swift @@ -0,0 +1,35 @@ +import CustomDump +import XCTest +@testable import ElixxirDAppsSDK + +final class MessageSendReportTests: XCTestCase { + func testCoding() throws { + let messageId = secureRandomData(count: 32) + let jsonString = """ + { + "RoundList": { + "Rounds": [1,5,9] + }, + "MessageID": \(messageId.jsonEncodedBase64()), + "Timestamp": 1653582683183384000 + } + """ + let jsonData = jsonString.data(using: .utf8)! + let decoder = JSONDecoder() + decoder.dataDecodingStrategy = .base64 + let report = try decoder.decode(MessageSendReport.self, from: jsonData) + + XCTAssertNoDifference(report, MessageSendReport( + roundList: [1, 5, 9], + messageId: messageId, + timestamp: 1_653_582_683_183_384_000 + )) + + let encoder = JSONEncoder() + encoder.dataEncodingStrategy = .base64 + let encodedReport = try encoder.encode(report) + let decodedReport = try decoder.decode(MessageSendReport.self, from: encodedReport) + + XCTAssertNoDifference(decodedReport, report) + } +}