diff --git a/go.mod b/go.mod index 608a255..9d9d47f 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,7 @@ require ( go.temporal.io/sdk v1.13.1 go.uber.org/zap v1.21.0 google.golang.org/grpc v1.42.0 + google.golang.org/protobuf v1.27.1 ) require ( @@ -17,5 +18,4 @@ require ( go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.6.0 // indirect google.golang.org/genproto v0.0.0-20211104193956-4c6863e31247 // indirect - google.golang.org/protobuf v1.27.1 // indirect ) diff --git a/structutil/structutil.go b/structutil/structutil.go new file mode 100644 index 0000000..4170736 --- /dev/null +++ b/structutil/structutil.go @@ -0,0 +1,57 @@ +package structutil + +import ( + "encoding/json" + + "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/types/known/structpb" +) + +func BytesToInterface(bytes []byte) (interface{}, error) { + var obj map[string]interface{} + if err := json.Unmarshal(bytes, &obj); err != nil { + if err.Error() == "json: cannot unmarshal array into Go value of type map[string]interface {}" { + var objArray []map[string]interface{} + if err := json.Unmarshal(bytes, &objArray); err != nil { + return nil, err + } + return objArray, nil + } + } + + return obj, nil +} + +func MapToProtobufStruct(m map[string]interface{}) (*structpb.Struct, error) { + b, err := json.Marshal(m) + if err != nil { + return nil, err + } + s := &structpb.Struct{} + err = protojson.Unmarshal(b, s) + if err != nil { + return nil, err + } + return s, nil +} + +func ProtobufStructToMap(s *structpb.Struct) (map[string]interface{}, error) { + b, err := protojson.Marshal(s) + if err != nil { + return nil, err + } + m := make(map[string]interface{}) + err = json.Unmarshal(b, &m) + if err != nil { + return nil, err + } + return m, nil +} + +func StructToProtobufStruct(s interface{}) (*structpb.Struct, error) { + return MapToProtobufStruct(s.(map[string]interface{})) +} + +func ProtobufStructToStruct(s *structpb.Struct) (interface{}, error) { + return ProtobufStructToMap(s) +}