25
25
package serialization
26
26
27
27
import (
28
+ "errors"
28
29
"fmt"
29
30
"reflect"
31
+ "strings"
30
32
31
33
"github.com/gogo/protobuf/proto"
32
34
commonpb "go.temporal.io/api/common/v1"
@@ -107,17 +109,20 @@ type (
107
109
108
110
// SerializationError is an error type for serialization
109
111
SerializationError struct {
110
- msg string
112
+ encodingType enumspb.EncodingType
113
+ wrappedErr error
111
114
}
112
115
113
116
// DeserializationError is an error type for deserialization
114
117
DeserializationError struct {
115
- msg string
118
+ encodingType enumspb.EncodingType
119
+ wrappedErr error
116
120
}
117
121
118
122
// UnknownEncodingTypeError is an error type for unknown or unsupported encoding type
119
123
UnknownEncodingTypeError struct {
120
- encodingType enumspb.EncodingType
124
+ encodingTypeStr string
125
+ expectedEncodingStr []string
121
126
}
122
127
123
128
serializerImpl struct {
@@ -149,7 +154,7 @@ func (t *serializerImpl) DeserializeEvents(data *commonpb.DataBlob) ([]*historyp
149
154
// Client API currently specifies encodingType on requests which span multiple of these objects
150
155
err = events .Unmarshal (data .Data )
151
156
default :
152
- return nil , NewDeserializationError ( "DeserializeEvents invalid encoding" )
157
+ return nil , NewUnknownEncodingTypeError ( data . EncodingType . String (), enumspb . ENCODING_TYPE_PROTO3 )
153
158
}
154
159
if err != nil {
155
160
return nil , err
@@ -179,7 +184,7 @@ func (t *serializerImpl) DeserializeEvent(data *commonpb.DataBlob) (*historypb.H
179
184
// Client API currently specifies encodingType on requests which span multiple of these objects
180
185
err = event .Unmarshal (data .Data )
181
186
default :
182
- return nil , NewDeserializationError ( "DeserializeEvent invalid encoding" )
187
+ return nil , NewUnknownEncodingTypeError ( data . EncodingType . String (), enumspb . ENCODING_TYPE_PROTO3 )
183
188
}
184
189
185
190
if err != nil {
@@ -212,7 +217,7 @@ func (t *serializerImpl) DeserializeClusterMetadata(data *commonpb.DataBlob) (*p
212
217
// Client API currently specifies encodingType on requests which span multiple of these objects
213
218
err = cm .Unmarshal (data .Data )
214
219
default :
215
- return nil , NewDeserializationError ( "DeserializeClusterMetadata invalid encoding" )
220
+ return nil , NewUnknownEncodingTypeError ( data . EncodingType . String (), enumspb . ENCODING_TYPE_PROTO3 )
216
221
}
217
222
218
223
if err != nil {
@@ -235,11 +240,11 @@ func (t *serializerImpl) serialize(p proto.Marshaler, encodingType enumspb.Encod
235
240
// Client API currently specifies encodingType on requests which span multiple of these objects
236
241
data , err = p .Marshal ()
237
242
default :
238
- return nil , NewUnknownEncodingTypeError (encodingType )
243
+ return nil , NewUnknownEncodingTypeError (encodingType . String (), enumspb . ENCODING_TYPE_PROTO3 )
239
244
}
240
245
241
246
if err != nil {
242
- return nil , NewSerializationError (err . Error () )
247
+ return nil , NewSerializationError (enumspb . ENCODING_TYPE_PROTO3 , err )
243
248
}
244
249
245
250
// Shouldn't happen, but keeping
@@ -254,30 +259,68 @@ func (t *serializerImpl) serialize(p proto.Marshaler, encodingType enumspb.Encod
254
259
}
255
260
256
261
// NewUnknownEncodingTypeError returns a new instance of encoding type error
257
- func NewUnknownEncodingTypeError (encodingType enumspb.EncodingType ) error {
258
- return & UnknownEncodingTypeError {encodingType : encodingType }
262
+ func NewUnknownEncodingTypeError (
263
+ encodingTypeStr string ,
264
+ expectedEncoding ... enumspb.EncodingType ,
265
+ ) error {
266
+ if len (expectedEncoding ) == 0 {
267
+ for encodingType := range enumspb .EncodingType_name {
268
+ expectedEncoding = append (expectedEncoding , enumspb .EncodingType (encodingType ))
269
+ }
270
+ }
271
+ expectedEncodingStr := make ([]string , 0 , len (expectedEncoding ))
272
+ for _ , encodingType := range expectedEncoding {
273
+ expectedEncodingStr = append (expectedEncodingStr , encodingType .String ())
274
+ }
275
+ return & UnknownEncodingTypeError {
276
+ encodingTypeStr : encodingTypeStr ,
277
+ expectedEncodingStr : expectedEncodingStr ,
278
+ }
259
279
}
260
280
261
281
func (e * UnknownEncodingTypeError ) Error () string {
262
- return fmt .Sprintf ("unknown or unsupported encoding type %v" , e .encodingType )
282
+ return fmt .Sprintf ("unknown or unsupported encoding type %v, supported types: %v" ,
283
+ e .encodingTypeStr ,
284
+ strings .Join (e .expectedEncodingStr , "," ),
285
+ )
263
286
}
264
287
265
288
// NewSerializationError returns a SerializationError
266
- func NewSerializationError (msg string ) error {
267
- return & SerializationError {msg : msg }
289
+ func NewSerializationError (
290
+ encodingType enumspb.EncodingType ,
291
+ serializationErr error ,
292
+ ) error {
293
+ return & SerializationError {
294
+ encodingType : encodingType ,
295
+ wrappedErr : serializationErr ,
296
+ }
268
297
}
269
298
270
299
func (e * SerializationError ) Error () string {
271
- return fmt .Sprintf ("serialization error: %v" , e .msg )
300
+ return fmt .Sprintf ("error serializing using %v encoding: %v" , e .encodingType , e .wrappedErr )
301
+ }
302
+
303
+ func (e * SerializationError ) Unwrap () error {
304
+ return e .wrappedErr
272
305
}
273
306
274
307
// NewDeserializationError returns a DeserializationError
275
- func NewDeserializationError (msg string ) error {
276
- return & DeserializationError {msg : msg }
308
+ func NewDeserializationError (
309
+ encodingType enumspb.EncodingType ,
310
+ deserializationErr error ,
311
+ ) error {
312
+ return & DeserializationError {
313
+ encodingType : encodingType ,
314
+ wrappedErr : deserializationErr ,
315
+ }
277
316
}
278
317
279
318
func (e * DeserializationError ) Error () string {
280
- return fmt .Sprintf ("deserialization error: %v" , e .msg )
319
+ return fmt .Sprintf ("error deserializing using %v encoding: %v" , e .encodingType , e .wrappedErr )
320
+ }
321
+
322
+ func (e * DeserializationError ) Unwrap () error {
323
+ return e .wrappedErr
281
324
}
282
325
283
326
func (t * serializerImpl ) ShardInfoToBlob (info * persistencespb.ShardInfo , encodingType enumspb.EncodingType ) (* commonpb.DataBlob , error ) {
@@ -469,23 +512,23 @@ func (t *serializerImpl) ReplicationTaskFromBlob(data *commonpb.DataBlob) (*repl
469
512
func ProtoDecodeBlob (data * commonpb.DataBlob , result proto.Message ) error {
470
513
if data == nil {
471
514
// TODO: should we return nil or error?
472
- return NewDeserializationError ("cannot decode nil" )
515
+ return NewDeserializationError (enumspb . ENCODING_TYPE_UNSPECIFIED , errors . New ( "cannot decode nil" ) )
473
516
}
474
517
475
518
if data .EncodingType != enumspb .ENCODING_TYPE_PROTO3 {
476
- return NewDeserializationError ( fmt . Sprintf ( "encoding %v doesn't match expected encoding %v" , data .EncodingType , enumspb .ENCODING_TYPE_PROTO3 ) )
519
+ return NewUnknownEncodingTypeError ( data .EncodingType . String () , enumspb .ENCODING_TYPE_PROTO3 )
477
520
}
478
521
479
522
if err := proto .Unmarshal (data .Data , result ); err != nil {
480
- return NewDeserializationError (fmt . Sprintf ( "error deserializing blob using %v encoding: %s" , enumspb .ENCODING_TYPE_PROTO3 , err ) )
523
+ return NewDeserializationError (enumspb .ENCODING_TYPE_PROTO3 , err )
481
524
}
482
525
return nil
483
526
}
484
527
485
528
func decodeBlob (data * commonpb.DataBlob , result proto.Message ) error {
486
529
if data == nil {
487
530
// TODO: should we return nil or error?
488
- return NewDeserializationError ("cannot decode nil" )
531
+ return NewDeserializationError (enumspb . ENCODING_TYPE_UNSPECIFIED , errors . New ( "cannot decode nil" ) )
489
532
}
490
533
491
534
if data .Data == nil {
@@ -498,7 +541,7 @@ func decodeBlob(data *commonpb.DataBlob, result proto.Message) error {
498
541
case enumspb .ENCODING_TYPE_PROTO3 :
499
542
return ProtoDecodeBlob (data , result )
500
543
default :
501
- return NewUnknownEncodingTypeError (data .EncodingType )
544
+ return NewUnknownEncodingTypeError (data .EncodingType . String (), enumspb . ENCODING_TYPE_JSON , enumspb . ENCODING_TYPE_PROTO3 )
502
545
}
503
546
}
504
547
@@ -523,13 +566,13 @@ func encodeBlob(o proto.Message, encoding enumspb.EncodingType) (*commonpb.DataB
523
566
case enumspb .ENCODING_TYPE_PROTO3 :
524
567
return ProtoEncodeBlob (o , enumspb .ENCODING_TYPE_PROTO3 )
525
568
default :
526
- return nil , NewUnknownEncodingTypeError (encoding )
569
+ return nil , NewUnknownEncodingTypeError (encoding . String (), enumspb . ENCODING_TYPE_JSON , enumspb . ENCODING_TYPE_PROTO3 )
527
570
}
528
571
}
529
572
530
573
func ProtoEncodeBlob (m proto.Message , encoding enumspb.EncodingType ) (* commonpb.DataBlob , error ) {
531
574
if encoding != enumspb .ENCODING_TYPE_PROTO3 {
532
- return nil , NewUnknownEncodingTypeError (encoding )
575
+ return nil , NewUnknownEncodingTypeError (encoding . String (), enumspb . ENCODING_TYPE_PROTO3 )
533
576
}
534
577
535
578
if m == nil || (reflect .ValueOf (m ).Kind () == reflect .Ptr && reflect .ValueOf (m ).IsNil ()) {
@@ -543,7 +586,7 @@ func ProtoEncodeBlob(m proto.Message, encoding enumspb.EncodingType) (*commonpb.
543
586
blob := & commonpb.DataBlob {EncodingType : enumspb .ENCODING_TYPE_PROTO3 }
544
587
data , err := proto .Marshal (m )
545
588
if err != nil {
546
- return nil , NewSerializationError (err . Error () )
589
+ return nil , NewSerializationError (enumspb . ENCODING_TYPE_PROTO3 , err )
547
590
}
548
591
blob .Data = data
549
592
return blob , nil
0 commit comments