-
Notifications
You must be signed in to change notification settings - Fork 2
/
message.go
86 lines (69 loc) · 1.72 KB
/
message.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
package protoo
import (
"encoding/json"
"fmt"
)
type Message struct {
OK bool `json:"ok,omitempty"`
Request bool `json:"request,omitempty"`
Response bool `json:"response,omitempty"`
Notification bool `json:"notification,omitempty"`
Id uint32 `json:"id,omitempty"`
Method string `json:"method,omitempty"`
Data json.RawMessage `json:"data,omitempty"`
*Error
}
type Error struct {
ErrorCode int `json:"errorCode,omitempty"`
ErrorReason string `json:"errorReason,omitempty"`
}
func NewError(code int, reason string) *Error {
return &Error{
ErrorCode: code,
ErrorReason: reason,
}
}
func (e Error) Error() string {
return fmt.Sprintf("%d: %s", e.ErrorCode, e.ErrorReason)
}
func (m Message) String() string {
data, _ := json.Marshal(m)
return string(data)
}
func (m Message) Marshal() []byte {
data, _ := json.Marshal(m)
return data
}
func CreateRequest(method string, data interface{}) Message {
raw, _ := json.Marshal(data)
return Message{
Request: true,
Id: generateRandomNumber(),
Method: method,
Data: json.RawMessage(raw),
}
}
func CreateSuccessResponse(request Message, data interface{}) Message {
raw, _ := json.Marshal(data)
return Message{
Response: true,
Id: request.Id,
OK: true,
Data: json.RawMessage(raw),
}
}
func CreateErrorResponse(request Message, err *Error) Message {
return Message{
Response: true,
Id: request.Id,
Error: err,
}
}
func CreateNotification(method string, data interface{}) Message {
raw, _ := json.Marshal(data)
return Message{
Notification: true,
Method: method,
Data: json.RawMessage(raw),
}
}