@@ -71,22 +71,32 @@ type (
7171 ToData (value ... interface {}) (* commonpb.Payloads , error )
7272 // FromData implements conversion of an array of values of different types.
7373 // Useful for deserializing arguments of function invocations.
74- FromData (input * commonpb.Payloads , valuePtr ... interface {}) error
74+ FromData (input * commonpb.Payloads , valuePtrs ... interface {}) error
7575 }
7676
77- // defaultDataConverter uses JSON.
78- defaultDataConverter struct {}
77+ // PayloadConverter converts single value to/from payload.
78+ PayloadConverter interface {
79+ // ToData single value to payload.
80+ ToData (value interface {}) (* commonpb.Payload , error )
81+ // FromData single value from payload.
82+ FromData (input * commonpb.Payload , valuePtr interface {}) error
83+ }
84+
85+ defaultPayloadConverter struct {}
7986
80- // NameValuePair represent named value.
81- NameValuePair struct {
82- Name string
83- Value interface {}
87+ defaultDataConverter struct {
88+ payloadConverter PayloadConverter
8489 }
8590)
8691
8792var (
88- // DefaultDataConverter is default data converter used by Temporal worker
89- DefaultDataConverter = & defaultDataConverter {}
93+ // DefaultPayloadConverter is default single value serializer.
94+ DefaultPayloadConverter = & defaultPayloadConverter {}
95+
96+ // DefaultDataConverter is default data converter used by Temporal worker.
97+ DefaultDataConverter = & defaultDataConverter {
98+ payloadConverter : DefaultPayloadConverter ,
99+ }
90100
91101 // ErrMetadataIsNotSet is returned when metadata is not set.
92102 ErrMetadataIsNotSet = errors .New ("metadata is not set" )
@@ -102,7 +112,7 @@ var (
102112 ErrUnableToSetBytes = errors .New ("unable to set []byte value" )
103113)
104114
105- // getDefaultDataConverter return default data converter used by Temporal worker
115+ // getDefaultDataConverter return default data converter used by Temporal worker.
106116func getDefaultDataConverter () DataConverter {
107117 return DefaultDataConverter
108118}
@@ -114,34 +124,11 @@ func (dc *defaultDataConverter) ToData(values ...interface{}) (*commonpb.Payload
114124
115125 result := & commonpb.Payloads {}
116126 for i , value := range values {
117- nvp , ok := value .(NameValuePair )
118- if ! ok {
119- nvp .Name = fmt .Sprintf ("values[%d]" , i )
120- nvp .Value = value
127+ payload , err := dc .payloadConverter .ToData (value )
128+ if err != nil {
129+ return nil , fmt .Errorf ("values[%d]: %w" , i , err )
121130 }
122131
123- var payload * commonpb.Payload
124- if bytes , isByteSlice := nvp .Value .([]byte ); isByteSlice {
125- payload = & commonpb.Payload {
126- Metadata : map [string ][]byte {
127- metadataEncoding : []byte (metadataEncodingRaw ),
128- metadataName : []byte (nvp .Name ),
129- },
130- Data : bytes ,
131- }
132- } else {
133- data , err := json .Marshal (nvp .Value )
134- if err != nil {
135- return nil , fmt .Errorf ("%s: %w: %v" , nvp .Name , ErrUnableToEncodeJSON , err )
136- }
137- payload = & commonpb.Payload {
138- Metadata : map [string ][]byte {
139- metadataEncoding : []byte (metadataEncodingJSON ),
140- metadataName : []byte (nvp .Name ),
141- },
142- Data : data ,
143- }
144- }
145132 result .Payloads = append (result .Payloads , payload )
146133 }
147134
@@ -158,40 +145,71 @@ func (dc *defaultDataConverter) FromData(payloads *commonpb.Payloads, valuePtrs
158145 break
159146 }
160147
161- metadata := payload . GetMetadata ( )
162- if metadata = = nil {
163- return fmt .Errorf ("payload item %d: %w" , i , ErrMetadataIsNotSet )
148+ err := dc . payloadConverter . FromData ( payload , valuePtrs [ i ] )
149+ if err ! = nil {
150+ return fmt .Errorf ("payload item %d: %w" , i , err )
164151 }
152+ }
165153
166- var name string
167- if n , ok := metadata [metadataName ]; ok {
168- name = string (n )
169- } else {
170- name = fmt .Sprintf ("values[%d]" , i )
171- }
154+ return nil
155+ }
172156
173- var encoding string
174- if e , ok := metadata [metadataEncoding ]; ok {
175- encoding = string (e )
176- } else {
177- return fmt .Errorf ("%s: %w" , name , ErrEncodingIsNotSet )
157+ func (vs * defaultPayloadConverter ) ToData (value interface {}) (* commonpb.Payload , error ) {
158+ var payload * commonpb.Payload
159+ if bytes , isByteSlice := value .([]byte ); isByteSlice {
160+ payload = & commonpb.Payload {
161+ Metadata : map [string ][]byte {
162+ metadataEncoding : []byte (metadataEncodingRaw ),
163+ },
164+ Data : bytes ,
165+ }
166+ } else {
167+ data , err := json .Marshal (value )
168+ if err != nil {
169+ return nil , fmt .Errorf ("%w: %v" , ErrUnableToEncodeJSON , err )
170+ }
171+ payload = & commonpb.Payload {
172+ Metadata : map [string ][]byte {
173+ metadataEncoding : []byte (metadataEncodingJSON ),
174+ },
175+ Data : data ,
178176 }
177+ }
178+
179+ return payload , nil
180+ }
181+
182+ func (vs * defaultPayloadConverter ) FromData (payload * commonpb.Payload , valuePtr interface {}) error {
183+ if payload == nil {
184+ return nil
185+ }
179186
180- switch encoding {
181- case metadataEncodingRaw :
182- valueBytes := reflect .ValueOf (valuePtrs [i ]).Elem ()
183- if ! valueBytes .CanSet () {
184- return fmt .Errorf ("%s: %w" , name , ErrUnableToSetBytes )
185- }
186- valueBytes .SetBytes (payload .GetData ())
187- case metadataEncodingJSON :
188- err := json .Unmarshal (payload .GetData (), valuePtrs [i ])
189- if err != nil {
190- return fmt .Errorf ("%s: %w: %v" , name , ErrUnableToDecodeJSON , err )
191- }
192- default :
193- return fmt .Errorf ("%s, encoding %s: %w" , name , encoding , ErrEncodingIsNotSupported )
187+ metadata := payload .GetMetadata ()
188+ if metadata == nil {
189+ return ErrMetadataIsNotSet
190+ }
191+
192+ var encoding string
193+ if e , ok := metadata [metadataEncoding ]; ok {
194+ encoding = string (e )
195+ } else {
196+ return ErrEncodingIsNotSet
197+ }
198+
199+ switch encoding {
200+ case metadataEncodingRaw :
201+ valueBytes := reflect .ValueOf (valuePtr ).Elem ()
202+ if ! valueBytes .CanSet () {
203+ return ErrUnableToSetBytes
204+ }
205+ valueBytes .SetBytes (payload .GetData ())
206+ case metadataEncodingJSON :
207+ err := json .Unmarshal (payload .GetData (), valuePtr )
208+ if err != nil {
209+ return fmt .Errorf ("%w: %v" , ErrUnableToDecodeJSON , err )
194210 }
211+ default :
212+ return fmt .Errorf ("encoding %s: %w" , encoding , ErrEncodingIsNotSupported )
195213 }
196214
197215 return nil
0 commit comments