-
Notifications
You must be signed in to change notification settings - Fork 9
/
raw.go
92 lines (80 loc) · 2.05 KB
/
raw.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
package protocol
import (
"bytes"
"errors"
)
// Raw type used by Centrifuge protocol as a type for fields in structs which
// value we want to stay untouched. For example custom application specific JSON
// payload data in published message. This is very similar to json.RawMessage
// type but have some extra methods to fit gogo/protobuf custom type interface.
type Raw []byte
// Marshal encodes Raw to slice of bytes. Exists to fit gogo/protobuf custom
// type interface.
func (r Raw) Marshal() ([]byte, error) {
if len(r) == 0 {
return nil, nil
}
return r, nil
}
// MarshalTo exists to fit gogo/protobuf custom type interface.
func (r Raw) MarshalTo(data []byte) (n int, err error) {
if len(r) == 0 {
return 0, nil
}
copy(data, r)
return len(r), nil
}
// Unmarshal exists to fit gogo/protobuf custom type interface.
func (r *Raw) Unmarshal(data []byte) error {
if len(data) == 0 {
return nil
}
id := Raw(make([]byte, len(data)))
copy(id, data)
*r = id
return nil
}
// Size exists to fit gogo/protobuf custom type interface.
func (r *Raw) Size() int {
if r == nil {
return 0
}
return len(*r)
}
// MarshalJSON returns *r as the JSON encoding of r.
func (r Raw) MarshalJSON() ([]byte, error) {
if r == nil {
return []byte("null"), nil
}
return r, nil
}
// UnmarshalJSON sets *r to a copy of data.
func (r *Raw) UnmarshalJSON(data []byte) error {
if r == nil {
return errors.New("unmarshal Raw: UnmarshalJSON on nil pointer")
}
*r = append((*r)[0:0], data...)
return nil
}
// Equal exists to fit gogo/protobuf custom type interface.
func (r Raw) Equal(other Raw) bool {
return bytes.Equal(r[0:], other[0:])
}
// Compare exists to fit gogo/protobuf custom type interface.
func (r Raw) Compare(other Raw) int {
return bytes.Compare(r[0:], other[0:])
}
type intn interface {
Intn(n int) int
}
// NewPopulatedRaw required for gogoprotobuf custom type.
func NewPopulatedRaw(r intn) *Raw {
v1 := r.Intn(100)
data := make([]byte, v1)
for i := 0; i < v1; i++ {
data[i] = byte('a')
}
d := `{"key":"` + string(data) + `"}`
raw := Raw(d)
return &raw
}