-
Notifications
You must be signed in to change notification settings - Fork 437
/
utils.go
127 lines (113 loc) · 3.04 KB
/
utils.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
123
124
125
126
127
package protoutils
import (
"bytes"
gogojson "github.com/gogo/protobuf/jsonpb"
"github.com/gogo/protobuf/types"
"github.com/golang/protobuf/jsonpb"
"github.com/golang/protobuf/proto"
"github.com/golang/protobuf/ptypes/any"
structpb "github.com/golang/protobuf/ptypes/struct"
"github.com/rotisserie/eris"
)
var (
jsonpbMarshaler = &jsonpb.Marshaler{OrigName: false}
jsonpbMarshalerEmitZeroValues = &jsonpb.Marshaler{OrigName: false, EmitDefaults: true}
gogoJsonpbMarshaler = &gogojson.Marshaler{OrigName: false}
NilStructError = eris.New("cannot unmarshal nil struct")
)
// this function is designed for converting go object (that is not a proto.Message) into a
// pb Struct, based on json struct tags
func MarshalStruct(m proto.Message) (*structpb.Struct, error) {
data, err := MarshalBytes(m)
if err != nil {
return nil, err
}
var pb structpb.Struct
err = jsonpb.UnmarshalString(string(data), &pb)
return &pb, err
}
func MarshalStructEmitZeroValues(m proto.Message) (*structpb.Struct, error) {
data, err := MarshalBytesEmitZeroValues(m)
if err != nil {
return nil, err
}
var pb structpb.Struct
err = jsonpb.UnmarshalString(string(data), &pb)
return &pb, err
}
func UnmarshalStruct(structuredData *structpb.Struct, into proto.Message) error {
if structuredData == nil {
return NilStructError
}
strData, err := jsonpbMarshaler.MarshalToString(structuredData)
if err != nil {
return err
}
return jsonpb.UnmarshalString(strData, into)
}
func MarshalBytes(pb proto.Message) ([]byte, error) {
buf := &bytes.Buffer{}
err := jsonpbMarshaler.Marshal(buf, pb)
return buf.Bytes(), err
}
func MarshalBytesEmitZeroValues(pb proto.Message) ([]byte, error) {
buf := &bytes.Buffer{}
err := jsonpbMarshalerEmitZeroValues.Marshal(buf, pb)
return buf.Bytes(), err
}
func StructPbToGogo(structuredData *structpb.Struct) (*types.Struct, error) {
if structuredData == nil {
return nil, NilStructError
}
byt, err := proto.Marshal(structuredData)
if err != nil {
return nil, err
}
var st types.Struct
if err := proto.Unmarshal(byt, &st); err != nil {
return nil, err
}
return &st, nil
}
func StructGogoToPb(structuredData *types.Struct) (*structpb.Struct, error) {
if structuredData == nil {
return nil, NilStructError
}
byt, err := proto.Marshal(structuredData)
if err != nil {
return nil, err
}
var st structpb.Struct
if err := proto.Unmarshal(byt, &st); err != nil {
return nil, err
}
return &st, nil
}
func AnyPbToGogo(structuredData *any.Any) (*types.Any, error) {
if structuredData == nil {
return nil, NilStructError
}
byt, err := proto.Marshal(structuredData)
if err != nil {
return nil, err
}
var st types.Any
if err := proto.Unmarshal(byt, &st); err != nil {
return nil, err
}
return &st, nil
}
func AnyGogoToPb(structuredData *types.Any) (*any.Any, error) {
if structuredData == nil {
return nil, NilStructError
}
byt, err := proto.Marshal(structuredData)
if err != nil {
return nil, err
}
var st any.Any
if err := proto.Unmarshal(byt, &st); err != nil {
return nil, err
}
return &st, nil
}