This repository has been archived by the owner on Oct 9, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 53
/
marshal_utils.go
executable file
·88 lines (70 loc) · 1.87 KB
/
marshal_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
package utils
import (
"encoding/json"
"fmt"
"strings"
"github.com/golang/protobuf/jsonpb"
"github.com/golang/protobuf/proto"
structpb "github.com/golang/protobuf/ptypes/struct"
)
var jsonPbMarshaler = jsonpb.Marshaler{}
var jsonPbUnmarshaler = &jsonpb.Unmarshaler{
AllowUnknownFields: true,
}
func UnmarshalStruct(structObj *structpb.Struct, msg proto.Message) error {
if structObj == nil {
return fmt.Errorf("nil Struct Object passed")
}
jsonObj, err := jsonPbMarshaler.MarshalToString(structObj)
if err != nil {
return err
}
if err = jsonPbUnmarshaler.Unmarshal(strings.NewReader(jsonObj), msg); err != nil {
return err
}
return nil
}
func MarshalStruct(in proto.Message, out *structpb.Struct) error {
if out == nil {
return fmt.Errorf("nil Struct Object passed")
}
jsonObj, err := jsonPbMarshaler.MarshalToString(in)
if err != nil {
return err
}
if err = jsonpb.UnmarshalString(jsonObj, out); err != nil {
return err
}
return nil
}
func MarshalToString(msg proto.Message) (string, error) {
return jsonPbMarshaler.MarshalToString(msg)
}
// TODO: Use the stdlib version in the future, or move there if not there.
// Don't use this if input is a proto Message.
func MarshalObjToStruct(input interface{}) (*structpb.Struct, error) {
b, err := json.Marshal(input)
if err != nil {
return nil, err
}
// Turn JSON into a protobuf struct
structObj := &structpb.Struct{}
if err := jsonpb.UnmarshalString(string(b), structObj); err != nil {
return nil, err
}
return structObj, nil
}
// Don't use this if the unmarshalled obj is a proto message.
func UnmarshalStructToObj(structObj *structpb.Struct, obj interface{}) error {
if structObj == nil {
return fmt.Errorf("nil Struct Object passed")
}
jsonObj, err := json.Marshal(structObj)
if err != nil {
return err
}
if err = json.Unmarshal(jsonObj, obj); err != nil {
return err
}
return nil
}