Skip to content

Instantly share code, notes, and snippets.

@nasdf
Created June 9, 2020 17:22
Show Gist options
  • Save nasdf/5efb0e8ad4c052a443625daa87c3937f to your computer and use it in GitHub Desktop.
Save nasdf/5efb0e8ad4c052a443625daa87c3937f to your computer and use it in GitHub Desktop.
Swift JSON-RPC 2.0
import Foundation
class RPCMessage: Codable {
var container: KeyedDecodingContainer<CodingKeys>
var timestamp = NSDate.now.timeIntervalSince1970
var jsonrpc = "2.0"
var method: String?
var id: Int?
var params: [RPCParameter]?
var error: RPCError?
var result: RPCResult?
enum CodingKeys: CodingKey {
case jsonrpc, method, id, params, error, result
}
required init(from decoder: Decoder) throws {
self.container = try decoder.container(keyedBy: CodingKeys.self)
self.jsonrpc = try container.decode(String.self, forKey: .jsonrpc)
self.method = try container.decodeIfPresent(String.self, forKey: .method)
self.id = try container.decodeIfPresent(Int.self, forKey: .id)
self.error = try container.decodeIfPresent(RPCError.self, forKey: .error)
}
}
struct RPCError: Codable {
var code: Code?
var message: String?
enum Code: Int, Codable {
case parseError = -32700
case invalidRequest = -32600
case methodNotFound = -32601
case invalidParams = -32602
case internalError = -32603
}
}
// inherit for method params
class RPCParameter: Codable {}
// inherit for method results
class RPCResult: Codable {}
// usage
let decoder = JSONDecoder()
let message = try decoder.decode(RPCMessage.self, from: data)
// decode params from request
if message.method != nil {
let params = try message.container.decode([MyParameter].self, forKey: .params)
}
// decode result from response
if message.method == nil {
let result = try message.container.decode(MyResult.self, forKey: .result)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment