spb/os-vault Public
Self-custody, multi-chain crypto wallet for macOS. One recovery phrase, six chain families, zero API keys — nothing leaves your Mac.
Swift 96%
Shell 3.4%
Makefile 0.6%
1import Foundation23public protocol APIClientResponse: Decodable {4 associatedtype Entity: Decodable5 var result: Entity? { get }6 var error: ResponseError? { get }7}89/// Class is used to wrap Entity to not be responsible from a concrete type10public struct AnyResponse<Entity: Decodable>: APIClientResponse {11 public var result: Entity?12 public var error: ResponseError?1314 public init<T: APIClientResponse>(_ response: T) where T.Entity == Entity {15 result = response.result16 error = response.error17 }1819 public init(from decoder: Decoder) throws {20 let container = try decoder.container(keyedBy: CodingKeys.self)21 do {22 result = try container.decodeIfPresent(Entity.self, forKey: .result) ?? nil23 } catch let error as APIClientError {24 throw error25 } catch {26 result = nil27 }28 error = try container.decodeIfPresent(ResponseError.self, forKey: .error)29 }3031 enum CodingKeys: String, CodingKey {32 case result33 case error34 }35}3637public struct JSONRPCResponse<Entity: Decodable>: APIClientResponse {38 public let jsonrpc: String39 public let id: String?40 public let result: Entity?41 public let error: ResponseError?42 public let method: String?4344 public init(id: String? = nil, result: Entity? = nil, error: ResponseError? = nil, method: String? = nil) {45 jsonrpc = "2.0"46 self.id = id ?? ""47 self.result = result48 self.error = error49 self.method = method50 }51}5253public class JSONRPCResponseDecoder<Entity: Decodable> {54 public func decode(with data: Data) throws -> Entity {55 try JSONDecoder().decode(Entity.self, from: data)56 }57}58