diff --git a/pkg/protoutil/struct.go b/pkg/protoutil/struct.go index 6d7a5f620..cb76dd41b 100644 --- a/pkg/protoutil/struct.go +++ b/pkg/protoutil/struct.go @@ -5,6 +5,8 @@ import ( "fmt" "reflect" + "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/structpb" ) @@ -45,6 +47,15 @@ func ToStruct(value interface{}) *structpb.Value { return NewStructNumber(float64(v)) } + if msg, ok := value.(proto.Message); ok { + bs, _ := protojson.Marshal(msg) + var s structpb.Struct + _ = protojson.Unmarshal(bs, &s) + return &structpb.Value{ + Kind: &structpb.Value_StructValue{StructValue: &s}, + } + } + rv := reflect.ValueOf(value) switch rv.Kind() { case reflect.Slice: diff --git a/pkg/protoutil/struct_test.go b/pkg/protoutil/struct_test.go index 0844f0c72..f25227b90 100644 --- a/pkg/protoutil/struct_test.go +++ b/pkg/protoutil/struct_test.go @@ -3,6 +3,8 @@ package protoutil import ( "testing" + "google.golang.org/protobuf/types/known/apipb" + "github.com/pomerium/pomerium/internal/testutil" ) @@ -28,6 +30,7 @@ func TestToValue(t *testing.T) { {"uint64", uint64(1), "1"}, {"[]interface{}", []interface{}{1, 2, 3, 4}, `[1,2,3,4]`}, {"map[string]interface{}", map[string]interface{}{"k1": "v1", "k2": "v2"}, `{"k1":"v1","k2":"v2"}`}, + {"Message", &apipb.Method{Name: "example"}, `{"name": "example"}`}, } for _, tc := range testCases { tc := tc