@@ -4,11 +4,13 @@ import (
4
4
"fmt"
5
5
"log/slog"
6
6
"strconv"
7
+ "strings"
7
8
8
9
pythonv1 "buf.build/gen/go/stealthrocket/dispatch-proto/protocolbuffers/go/dispatch/sdk/python/v1"
9
10
"google.golang.org/protobuf/types/known/anypb"
10
11
"google.golang.org/protobuf/types/known/durationpb"
11
12
"google.golang.org/protobuf/types/known/emptypb"
13
+ "google.golang.org/protobuf/types/known/structpb"
12
14
"google.golang.org/protobuf/types/known/timestamppb"
13
15
"google.golang.org/protobuf/types/known/wrapperspb"
14
16
)
@@ -67,6 +69,15 @@ func anyString(any *anypb.Any) string {
67
69
case * durationpb.Duration :
68
70
return mm .AsDuration ().String ()
69
71
72
+ case * structpb.Struct :
73
+ return structpbStructString (mm )
74
+
75
+ case * structpb.ListValue :
76
+ return structpbListString (mm )
77
+
78
+ case * structpb.Value :
79
+ return structpbValueString (mm )
80
+
70
81
case * pythonv1.Pickled :
71
82
s , err := pythonPickleString (mm .PickledValue )
72
83
if err != nil {
@@ -79,6 +90,55 @@ func anyString(any *anypb.Any) string {
79
90
}
80
91
}
81
92
93
+ func structpbStructString (s * structpb.Struct ) string {
94
+ var b strings.Builder
95
+ b .WriteByte ('{' )
96
+ i := 0
97
+ for name , value := range s .Fields {
98
+ if i > 0 {
99
+ b .WriteString (", " )
100
+ }
101
+ b .WriteString (fmt .Sprintf ("%q" , name ))
102
+ b .WriteString (": " )
103
+ b .WriteString (structpbValueString (value ))
104
+ i ++
105
+ }
106
+ b .WriteByte ('}' )
107
+ return b .String ()
108
+ }
109
+
110
+ func structpbListString (s * structpb.ListValue ) string {
111
+ var b strings.Builder
112
+ b .WriteByte ('[' )
113
+ for i , value := range s .Values {
114
+ if i > 0 {
115
+ b .WriteString (", " )
116
+ }
117
+ b .WriteString (structpbValueString (value ))
118
+ }
119
+ b .WriteByte (']' )
120
+ return b .String ()
121
+ }
122
+
123
+ func structpbValueString (s * structpb.Value ) string {
124
+ switch v := s .Kind .(type ) {
125
+ case * structpb.Value_StructValue :
126
+ return structpbStructString (v .StructValue )
127
+ case * structpb.Value_ListValue :
128
+ return structpbListString (v .ListValue )
129
+ case * structpb.Value_BoolValue :
130
+ return strconv .FormatBool (v .BoolValue )
131
+ case * structpb.Value_NumberValue :
132
+ return fmt .Sprintf ("%v" , v .NumberValue )
133
+ case * structpb.Value_StringValue :
134
+ return fmt .Sprintf ("%q" , v .StringValue )
135
+ case * structpb.Value_NullValue :
136
+ return "null"
137
+ default :
138
+ panic ("unreachable" )
139
+ }
140
+ }
141
+
82
142
func unsupportedAny (any * anypb.Any , err error ) string {
83
143
if err != nil {
84
144
slog .Debug ("cannot parse input/output value" , "error" , err )
0 commit comments