Skip to content

Commit 7019e82

Browse files
author
Divjot Arora
authored
GODRIVER-1551 Allow BSON undefined values to decode into Go types (#360)
1 parent 54b6491 commit 7019e82

11 files changed

+296
-5
lines changed

bson/bsoncodec/byte_slice_codec.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ func (bsc *ByteSliceCodec) DecodeValue(dc DecodeContext, vr bsonrw.ValueReader,
7878
case bsontype.Null:
7979
val.Set(reflect.Zero(val.Type()))
8080
return vr.ReadNull()
81+
case bsontype.Undefined:
82+
val.Set(reflect.Zero(val.Type()))
83+
return vr.ReadUndefined()
8184
default:
8285
return fmt.Errorf("cannot decode %v into a []byte", vrType)
8386
}

bson/bsoncodec/default_value_decoders.go

Lines changed: 70 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,10 @@ func (dvd DefaultValueDecoders) BooleanDecodeValue(dctx DecodeContext, vr bsonrw
140140
if err = vr.ReadNull(); err != nil {
141141
return err
142142
}
143+
case bsontype.Undefined:
144+
if err = vr.ReadUndefined(); err != nil {
145+
return err
146+
}
143147
default:
144148
return fmt.Errorf("cannot decode %v into a boolean", vrType)
145149
}
@@ -195,6 +199,10 @@ func (dvd DefaultValueDecoders) IntDecodeValue(dc DecodeContext, vr bsonrw.Value
195199
if err = vr.ReadNull(); err != nil {
196200
return err
197201
}
202+
case bsontype.Undefined:
203+
if err = vr.ReadUndefined(); err != nil {
204+
return err
205+
}
198206
default:
199207
return fmt.Errorf("cannot decode %v into an integer type", vrType)
200208
}
@@ -354,6 +362,10 @@ func (dvd DefaultValueDecoders) FloatDecodeValue(ec DecodeContext, vr bsonrw.Val
354362
if err = vr.ReadNull(); err != nil {
355363
return err
356364
}
365+
case bsontype.Undefined:
366+
if err = vr.ReadUndefined(); err != nil {
367+
return err
368+
}
357369
default:
358370
return fmt.Errorf("cannot decode %v into a float32 or float64 type", vrType)
359371
}
@@ -409,6 +421,8 @@ func (DefaultValueDecoders) JavaScriptDecodeValue(dctx DecodeContext, vr bsonrw.
409421
js, err = vr.ReadJavascript()
410422
case bsontype.Null:
411423
err = vr.ReadNull()
424+
case bsontype.Undefined:
425+
err = vr.ReadUndefined()
412426
default:
413427
return fmt.Errorf("cannot decode %v into a primitive.JavaScript", vrType)
414428
}
@@ -452,6 +466,10 @@ func (DefaultValueDecoders) SymbolDecodeValue(dctx DecodeContext, vr bsonrw.Valu
452466
if err = vr.ReadNull(); err != nil {
453467
return err
454468
}
469+
case bsontype.Undefined:
470+
if err = vr.ReadUndefined(); err != nil {
471+
return err
472+
}
455473
default:
456474
return fmt.Errorf("cannot decode %v into a primitive.Symbol", vrType)
457475
}
@@ -474,6 +492,8 @@ func (DefaultValueDecoders) BinaryDecodeValue(dc DecodeContext, vr bsonrw.ValueR
474492
data, subtype, err = vr.ReadBinary()
475493
case bsontype.Null:
476494
err = vr.ReadNull()
495+
case bsontype.Undefined:
496+
err = vr.ReadUndefined()
477497
default:
478498
return fmt.Errorf("cannot decode %v into a Binary", vrType)
479499
}
@@ -536,6 +556,10 @@ func (dvd DefaultValueDecoders) ObjectIDDecodeValue(dc DecodeContext, vr bsonrw.
536556
if err = vr.ReadNull(); err != nil {
537557
return err
538558
}
559+
case bsontype.Undefined:
560+
if err = vr.ReadUndefined(); err != nil {
561+
return err
562+
}
539563
default:
540564
return fmt.Errorf("cannot decode %v into an ObjectID", vrType)
541565
}
@@ -557,6 +581,8 @@ func (DefaultValueDecoders) DateTimeDecodeValue(dc DecodeContext, vr bsonrw.Valu
557581
dt, err = vr.ReadDateTime()
558582
case bsontype.Null:
559583
err = vr.ReadNull()
584+
case bsontype.Undefined:
585+
err = vr.ReadUndefined()
560586
default:
561587
return fmt.Errorf("cannot decode %v into a DateTime", vrType)
562588
}
@@ -574,12 +600,21 @@ func (DefaultValueDecoders) NullDecodeValue(dc DecodeContext, vr bsonrw.ValueRea
574600
return ValueDecoderError{Name: "NullDecodeValue", Types: []reflect.Type{tNull}, Received: val}
575601
}
576602

577-
if vrType := vr.Type(); vrType != bsontype.Null {
578-
return fmt.Errorf("cannot decode %v into a Null", vrType)
603+
var err error
604+
switch vrType := vr.Type(); vrType {
605+
case bsontype.Undefined:
606+
err = vr.ReadUndefined()
607+
case bsontype.Null:
608+
err = vr.ReadNull()
609+
default:
610+
return fmt.Errorf("cannot decode %v into a Null", vr.Type())
579611
}
580612

613+
if err != nil {
614+
return err
615+
}
581616
val.Set(reflect.ValueOf(primitive.Null{}))
582-
return vr.ReadNull()
617+
return nil
583618
}
584619

585620
// RegexDecodeValue is the ValueDecoderFunc for Regex.
@@ -595,6 +630,8 @@ func (DefaultValueDecoders) RegexDecodeValue(dc DecodeContext, vr bsonrw.ValueRe
595630
pattern, options, err = vr.ReadRegex()
596631
case bsontype.Null:
597632
err = vr.ReadNull()
633+
case bsontype.Undefined:
634+
err = vr.ReadUndefined()
598635
default:
599636
return fmt.Errorf("cannot decode %v into a Regex", vrType)
600637
}
@@ -620,6 +657,8 @@ func (DefaultValueDecoders) DBPointerDecodeValue(dc DecodeContext, vr bsonrw.Val
620657
ns, pointer, err = vr.ReadDBPointer()
621658
case bsontype.Null:
622659
err = vr.ReadNull()
660+
case bsontype.Undefined:
661+
err = vr.ReadUndefined()
623662
default:
624663
return fmt.Errorf("cannot decode %v into a DBPointer", vrType)
625664
}
@@ -644,6 +683,8 @@ func (DefaultValueDecoders) TimestampDecodeValue(dc DecodeContext, vr bsonrw.Val
644683
t, incr, err = vr.ReadTimestamp()
645684
case bsontype.Null:
646685
err = vr.ReadNull()
686+
case bsontype.Undefined:
687+
err = vr.ReadUndefined()
647688
default:
648689
return fmt.Errorf("cannot decode %v into a Timestamp", vrType)
649690
}
@@ -667,6 +708,8 @@ func (DefaultValueDecoders) MinKeyDecodeValue(dc DecodeContext, vr bsonrw.ValueR
667708
err = vr.ReadMinKey()
668709
case bsontype.Null:
669710
err = vr.ReadNull()
711+
case bsontype.Undefined:
712+
err = vr.ReadUndefined()
670713
default:
671714
return fmt.Errorf("cannot decode %v into a MinKey", vr.Type())
672715
}
@@ -690,6 +733,8 @@ func (DefaultValueDecoders) MaxKeyDecodeValue(dc DecodeContext, vr bsonrw.ValueR
690733
err = vr.ReadMaxKey()
691734
case bsontype.Null:
692735
err = vr.ReadNull()
736+
case bsontype.Undefined:
737+
err = vr.ReadUndefined()
693738
default:
694739
return fmt.Errorf("cannot decode %v into a MaxKey", vr.Type())
695740
}
@@ -714,6 +759,8 @@ func (dvd DefaultValueDecoders) Decimal128DecodeValue(dctx DecodeContext, vr bso
714759
d128, err = vr.ReadDecimal128()
715760
case bsontype.Null:
716761
err = vr.ReadNull()
762+
case bsontype.Undefined:
763+
err = vr.ReadUndefined()
717764
default:
718765
return fmt.Errorf("cannot decode %v into a primitive.Decimal128", vr.Type())
719766
}
@@ -755,6 +802,11 @@ func (dvd DefaultValueDecoders) JSONNumberDecodeValue(dc DecodeContext, vr bsonr
755802
return err
756803
}
757804
val.SetString("")
805+
case bsontype.Undefined:
806+
if err := vr.ReadUndefined(); err != nil {
807+
return err
808+
}
809+
val.SetString("")
758810
default:
759811
return fmt.Errorf("cannot decode %v into a json.Number", vrType)
760812
}
@@ -787,6 +839,12 @@ func (dvd DefaultValueDecoders) URLDecodeValue(dc DecodeContext, vr bsonrw.Value
787839
}
788840
val.Set(reflect.ValueOf(url.URL{}))
789841
return nil
842+
case bsontype.Undefined:
843+
if err := vr.ReadUndefined(); err != nil {
844+
return err
845+
}
846+
val.Set(reflect.ValueOf(url.URL{}))
847+
return nil
790848
default:
791849
return fmt.Errorf("cannot decode %v into a *url.URL", vrType)
792850
}
@@ -935,6 +993,9 @@ func (dvd DefaultValueDecoders) ArrayDecodeValue(dc DecodeContext, vr bsonrw.Val
935993
case bsontype.Null:
936994
val.Set(reflect.Zero(val.Type()))
937995
return vr.ReadNull()
996+
case bsontype.Undefined:
997+
val.Set(reflect.Zero(val.Type()))
998+
return vr.ReadUndefined()
938999
default:
9391000
return fmt.Errorf("cannot decode %v into an array", vrType)
9401001
}
@@ -1200,6 +1261,12 @@ func (dvd DefaultValueDecoders) CodeWithScopeDecodeValue(dc DecodeContext, vr bs
12001261
}
12011262
val.Set(reflect.ValueOf(primitive.CodeWithScope{}))
12021263
return nil
1264+
case bsontype.Undefined:
1265+
if err := vr.ReadUndefined(); err != nil {
1266+
return err
1267+
}
1268+
val.Set(reflect.ValueOf(primitive.CodeWithScope{}))
1269+
return nil
12031270
default:
12041271
return fmt.Errorf("cannot decode %v into a primitive.CodeWithScope", vrType)
12051272
}

0 commit comments

Comments
 (0)