SPB Git

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%
1.7 KB · 58 lines swift
Raw Blame History
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