-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmrpc.go
More file actions
248 lines (231 loc) · 5.26 KB
/
mrpc.go
File metadata and controls
248 lines (231 loc) · 5.26 KB
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
// Code generated by mprotc.
// Do not edit.
package mrpc
import (
"fmt"
"time"
msgpack "github.com/mprot/msgpack-go"
)
var _ = fmt.Errorf
var _ time.Time
var _ *msgpack.Writer
// ErrCode is an enumeration of supported error codes.
type ErrCode int
// Enumerators for ErrCode.
const (
OK ErrCode = 0
Unknown ErrCode = 1
Timeout ErrCode = 2
NotFound ErrCode = 3
AlreadyExists ErrCode = 4
InvalidArgument ErrCode = 5
Unauthorized ErrCode = 6
Forbidden ErrCode = 7
Internal ErrCode = 8
Unavailable ErrCode = 9
)
// EncodeMsgpack implements the Encoder interface for ErrCode.
func (o ErrCode) EncodeMsgpack(w *msgpack.Writer) error {
return w.WriteInt(int(o))
}
// DecodeMsgpack implements the Decoder interface for ErrCode.
func (o *ErrCode) DecodeMsgpack(r *msgpack.Reader) error {
val, err := r.ReadInt()
if err != nil {
return err
}
*o = ErrCode(val)
return nil
}
// RequestHeaders holds all supported header data for a mrpc request.
type RequestHeaders struct {
Timeout uint64
}
// EncodeMsgpack implements the Encoder interface for RequestHeaders.
func (o *RequestHeaders) EncodeMsgpack(w *msgpack.Writer) (err error) {
if err = w.WriteMapHeader(1); err != nil {
return err
}
// Timeout
if err = w.WriteInt64(1); err != nil {
return err
}
if err = w.WriteUint64(o.Timeout); err != nil {
return err
}
return nil
}
// DecodeMsgpack implements the Decoder interface for RequestHeaders.
func (o *RequestHeaders) DecodeMsgpack(r *msgpack.Reader) error {
n, err := r.ReadMapHeader()
if err != nil {
return err
}
for i := 0; i < n; i++ {
ord, err := r.ReadInt64()
if err != nil {
return err
}
switch ord {
case 1: // Timeout
if o.Timeout, err = r.ReadUint64(); err != nil {
return err
}
default:
if err := r.Skip(); err != nil {
return err
}
}
}
return nil
}
// Request holds the data for a single mrpc request. The target service is
// specified by its name and must be registered at the corresponding mrpc
// server. A service contains methods, each identified by an ordinal. With
// this ordinal the method of the targeted service is specified.
type Request struct {
Service string
Method int
Headers RequestHeaders
Body []byte
}
// EncodeMsgpack implements the Encoder interface for Request.
func (o *Request) EncodeMsgpack(w *msgpack.Writer) (err error) {
if err = w.WriteMapHeader(4); err != nil {
return err
}
// Service
if err = w.WriteInt64(1); err != nil {
return err
}
if err = w.WriteString(o.Service); err != nil {
return err
}
// Method
if err = w.WriteInt64(2); err != nil {
return err
}
if err = w.WriteInt(o.Method); err != nil {
return err
}
// Headers
if err = w.WriteInt64(3); err != nil {
return err
}
if err = o.Headers.EncodeMsgpack(w); err != nil {
return err
}
// Body
if err = w.WriteInt64(4); err != nil {
return err
}
if err = w.WriteBytes(o.Body); err != nil {
return err
}
return nil
}
// DecodeMsgpack implements the Decoder interface for Request.
func (o *Request) DecodeMsgpack(r *msgpack.Reader) error {
n, err := r.ReadMapHeader()
if err != nil {
return err
}
for i := 0; i < n; i++ {
ord, err := r.ReadInt64()
if err != nil {
return err
}
switch ord {
case 1: // Service
if o.Service, err = r.ReadString(); err != nil {
return err
}
case 2: // Method
if o.Method, err = r.ReadInt(); err != nil {
return err
}
case 3: // Headers
if err = o.Headers.DecodeMsgpack(r); err != nil {
return err
}
case 4: // Body
if o.Body, err = r.ReadBytes(nil); err != nil {
return err
}
default:
if err := r.Skip(); err != nil {
return err
}
}
}
return nil
}
// Response holds the data for an mrpc response. If ErrCode is not OK, an
// error with the specified error text will be reported to the client. In
// this case the return value will be ignored. In case of a successful call,
// the return value will be reported to the client.
type Response struct {
ErrorCode ErrCode
ErrorText string
Body []byte
}
// EncodeMsgpack implements the Encoder interface for Response.
func (o *Response) EncodeMsgpack(w *msgpack.Writer) (err error) {
if err = w.WriteMapHeader(3); err != nil {
return err
}
// ErrorCode
if err = w.WriteInt64(1); err != nil {
return err
}
if err = o.ErrorCode.EncodeMsgpack(w); err != nil {
return err
}
// ErrorText
if err = w.WriteInt64(2); err != nil {
return err
}
if err = w.WriteString(o.ErrorText); err != nil {
return err
}
// Body
if err = w.WriteInt64(3); err != nil {
return err
}
if err = w.WriteBytes(o.Body); err != nil {
return err
}
return nil
}
// DecodeMsgpack implements the Decoder interface for Response.
func (o *Response) DecodeMsgpack(r *msgpack.Reader) error {
n, err := r.ReadMapHeader()
if err != nil {
return err
}
for i := 0; i < n; i++ {
ord, err := r.ReadInt64()
if err != nil {
return err
}
switch ord {
case 1: // ErrorCode
if err = o.ErrorCode.DecodeMsgpack(r); err != nil {
return err
}
case 2: // ErrorText
if o.ErrorText, err = r.ReadString(); err != nil {
return err
}
case 3: // Body
if o.Body, err = r.ReadBytes(nil); err != nil {
return err
}
default:
if err := r.Skip(); err != nil {
return err
}
}
}
return nil
}