-
Notifications
You must be signed in to change notification settings - Fork 32
/
Copy pathJSONRPC.go
122 lines (99 loc) · 3.12 KB
/
JSONRPC.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package main
import (
"encoding/json"
)
// JSONRPCRequest JSON RPC 请求的数据结构
type JSONRPCRequest struct {
ID interface{} `json:"id"`
Method string `json:"method"`
Params []interface{} `json:"params"`
// Worker: ETHProxy from ethminer may contains this field
Worker string `json:"worker,omitempty"`
}
// JSONRPCResponse JSON RPC 响应的数据结构
type JSONRPCResponse struct {
ID interface{} `json:"id"`
Result interface{} `json:"result"`
Error interface{} `json:"error"`
}
// JSONRPC2Error error object of json-rpc 2.0
type JSONRPC2Error struct {
Code int `json:"code"`
Message string `json:"message"`
Data interface{} `json:"data,omitempty"`
}
// NewJSONRPC2Error create json-rpc 2.0 error object from json-1.0 error object
func NewJSONRPC2Error(v1Err interface{}) (err *JSONRPC2Error) {
if v1Err == nil {
return nil
}
errArr, ok := v1Err.(JSONRPCArray)
if !ok {
return nil
}
err = new(JSONRPC2Error)
if len(errArr) >= 1 {
code, ok := errArr[0].(int)
if ok {
err.Code = code
}
}
if len(errArr) >= 2 {
message, ok := errArr[1].(string)
if ok {
err.Message = message
}
}
if len(errArr) >= 3 {
err.Data = errArr[2]
}
return
}
// JSONRPC2Response response message of json-rpc 2.0
type JSONRPC2Response struct {
ID interface{} `json:"id"`
JSONRPC string `json:"jsonrpc"`
Result interface{} `json:"result,omitempty"`
Error *JSONRPC2Error `json:"error,omitempty"`
}
// JSONRPCArray JSON RPC 数组
type JSONRPCArray []interface{}
// JSONRPCObj JSON RPC 对象
type JSONRPCObj map[string]interface{}
// NewJSONRPCRequest 解析 JSON RPC 请求字符串并创建 JSONRPCRequest 对象
func NewJSONRPCRequest(rpcJSON []byte) (*JSONRPCRequest, error) {
rpcData := new(JSONRPCRequest)
err := json.Unmarshal(rpcJSON, &rpcData)
return rpcData, err
}
// AddParam 向 JSONRPCRequest 对象添加一个或多个参数
func (rpcData *JSONRPCRequest) AddParam(param ...interface{}) {
rpcData.Params = append(rpcData.Params, param...)
}
// SetParam 设置 JSONRPCRequest 对象的参数
// 传递给 SetParam 的参数列表将按顺序复制到 JSONRPCRequest.Params 中
func (rpcData *JSONRPCRequest) SetParam(param ...interface{}) {
rpcData.Params = param
}
// ToJSONBytes 将 JSONRPCRequest 对象转换为 JSON 字节序列
func (rpcData *JSONRPCRequest) ToJSONBytes() ([]byte, error) {
return json.Marshal(rpcData)
}
// NewJSONRPCResponse 解析 JSON RPC 响应字符串并创建 JSONRPCResponse 对象
func NewJSONRPCResponse(rpcJSON []byte) (*JSONRPCResponse, error) {
rpcData := new(JSONRPCResponse)
err := json.Unmarshal(rpcJSON, &rpcData)
return rpcData, err
}
// SetResult 设置 JSONRPCResponse 对象的返回结果
func (rpcData *JSONRPCResponse) SetResult(result interface{}) {
rpcData.Result = result
}
// ToJSONBytes 将 JSONRPCResponse 对象转换为 JSON 字节序列
func (rpcData *JSONRPCResponse) ToJSONBytes(version int) ([]byte, error) {
if version == 1 {
return json.Marshal(rpcData)
}
rpc2Data := JSONRPC2Response{rpcData.ID, "2.0", rpcData.Result, NewJSONRPC2Error(rpcData.Error)}
return json.Marshal(rpc2Data)
}