1
2
3
4
5
6
7 package bsoncodec
8
9 import (
10 "encoding/json"
11 "errors"
12 "fmt"
13 "math"
14 "net/url"
15 "reflect"
16 "strconv"
17 "time"
18
19 "go.mongodb.org/mongo-driver/bson/bsonrw"
20 "go.mongodb.org/mongo-driver/bson/bsontype"
21 "go.mongodb.org/mongo-driver/bson/primitive"
22 "go.mongodb.org/mongo-driver/x/bsonx/bsoncore"
23 )
24
25 var (
26 defaultValueDecoders DefaultValueDecoders
27 errCannotTruncate = errors.New("float64 can only be truncated to a lower precision type when truncation is enabled")
28 )
29
30 type decodeBinaryError struct {
31 subtype byte
32 typeName string
33 }
34
35 func (d decodeBinaryError) Error() string {
36 return fmt.Sprintf("only binary values with subtype 0x00 or 0x02 can be decoded into %s, but got subtype %v", d.typeName, d.subtype)
37 }
38
39 func newDefaultStructCodec() *StructCodec {
40 codec, err := NewStructCodec(DefaultStructTagParser)
41 if err != nil {
42
43
44 panic(fmt.Errorf("error creating default StructCodec: %w", err))
45 }
46 return codec
47 }
48
49
50
51
52
53
54 type DefaultValueDecoders struct{}
55
56
57
58
59
60
61
62
63
64
65 func (dvd DefaultValueDecoders) RegisterDefaultDecoders(rb *RegistryBuilder) {
66 if rb == nil {
67 panic(errors.New("argument to RegisterDefaultDecoders must not be nil"))
68 }
69
70 intDecoder := decodeAdapter{dvd.IntDecodeValue, dvd.intDecodeType}
71 floatDecoder := decodeAdapter{dvd.FloatDecodeValue, dvd.floatDecodeType}
72
73 rb.
74 RegisterTypeDecoder(tD, ValueDecoderFunc(dvd.DDecodeValue)).
75 RegisterTypeDecoder(tBinary, decodeAdapter{dvd.BinaryDecodeValue, dvd.binaryDecodeType}).
76 RegisterTypeDecoder(tUndefined, decodeAdapter{dvd.UndefinedDecodeValue, dvd.undefinedDecodeType}).
77 RegisterTypeDecoder(tDateTime, decodeAdapter{dvd.DateTimeDecodeValue, dvd.dateTimeDecodeType}).
78 RegisterTypeDecoder(tNull, decodeAdapter{dvd.NullDecodeValue, dvd.nullDecodeType}).
79 RegisterTypeDecoder(tRegex, decodeAdapter{dvd.RegexDecodeValue, dvd.regexDecodeType}).
80 RegisterTypeDecoder(tDBPointer, decodeAdapter{dvd.DBPointerDecodeValue, dvd.dBPointerDecodeType}).
81 RegisterTypeDecoder(tTimestamp, decodeAdapter{dvd.TimestampDecodeValue, dvd.timestampDecodeType}).
82 RegisterTypeDecoder(tMinKey, decodeAdapter{dvd.MinKeyDecodeValue, dvd.minKeyDecodeType}).
83 RegisterTypeDecoder(tMaxKey, decodeAdapter{dvd.MaxKeyDecodeValue, dvd.maxKeyDecodeType}).
84 RegisterTypeDecoder(tJavaScript, decodeAdapter{dvd.JavaScriptDecodeValue, dvd.javaScriptDecodeType}).
85 RegisterTypeDecoder(tSymbol, decodeAdapter{dvd.SymbolDecodeValue, dvd.symbolDecodeType}).
86 RegisterTypeDecoder(tByteSlice, defaultByteSliceCodec).
87 RegisterTypeDecoder(tTime, defaultTimeCodec).
88 RegisterTypeDecoder(tEmpty, defaultEmptyInterfaceCodec).
89 RegisterTypeDecoder(tCoreArray, defaultArrayCodec).
90 RegisterTypeDecoder(tOID, decodeAdapter{dvd.ObjectIDDecodeValue, dvd.objectIDDecodeType}).
91 RegisterTypeDecoder(tDecimal, decodeAdapter{dvd.Decimal128DecodeValue, dvd.decimal128DecodeType}).
92 RegisterTypeDecoder(tJSONNumber, decodeAdapter{dvd.JSONNumberDecodeValue, dvd.jsonNumberDecodeType}).
93 RegisterTypeDecoder(tURL, decodeAdapter{dvd.URLDecodeValue, dvd.urlDecodeType}).
94 RegisterTypeDecoder(tCoreDocument, ValueDecoderFunc(dvd.CoreDocumentDecodeValue)).
95 RegisterTypeDecoder(tCodeWithScope, decodeAdapter{dvd.CodeWithScopeDecodeValue, dvd.codeWithScopeDecodeType}).
96 RegisterDefaultDecoder(reflect.Bool, decodeAdapter{dvd.BooleanDecodeValue, dvd.booleanDecodeType}).
97 RegisterDefaultDecoder(reflect.Int, intDecoder).
98 RegisterDefaultDecoder(reflect.Int8, intDecoder).
99 RegisterDefaultDecoder(reflect.Int16, intDecoder).
100 RegisterDefaultDecoder(reflect.Int32, intDecoder).
101 RegisterDefaultDecoder(reflect.Int64, intDecoder).
102 RegisterDefaultDecoder(reflect.Uint, defaultUIntCodec).
103 RegisterDefaultDecoder(reflect.Uint8, defaultUIntCodec).
104 RegisterDefaultDecoder(reflect.Uint16, defaultUIntCodec).
105 RegisterDefaultDecoder(reflect.Uint32, defaultUIntCodec).
106 RegisterDefaultDecoder(reflect.Uint64, defaultUIntCodec).
107 RegisterDefaultDecoder(reflect.Float32, floatDecoder).
108 RegisterDefaultDecoder(reflect.Float64, floatDecoder).
109 RegisterDefaultDecoder(reflect.Array, ValueDecoderFunc(dvd.ArrayDecodeValue)).
110 RegisterDefaultDecoder(reflect.Map, defaultMapCodec).
111 RegisterDefaultDecoder(reflect.Slice, defaultSliceCodec).
112 RegisterDefaultDecoder(reflect.String, defaultStringCodec).
113 RegisterDefaultDecoder(reflect.Struct, newDefaultStructCodec()).
114 RegisterDefaultDecoder(reflect.Ptr, NewPointerCodec()).
115 RegisterTypeMapEntry(bsontype.Double, tFloat64).
116 RegisterTypeMapEntry(bsontype.String, tString).
117 RegisterTypeMapEntry(bsontype.Array, tA).
118 RegisterTypeMapEntry(bsontype.Binary, tBinary).
119 RegisterTypeMapEntry(bsontype.Undefined, tUndefined).
120 RegisterTypeMapEntry(bsontype.ObjectID, tOID).
121 RegisterTypeMapEntry(bsontype.Boolean, tBool).
122 RegisterTypeMapEntry(bsontype.DateTime, tDateTime).
123 RegisterTypeMapEntry(bsontype.Regex, tRegex).
124 RegisterTypeMapEntry(bsontype.DBPointer, tDBPointer).
125 RegisterTypeMapEntry(bsontype.JavaScript, tJavaScript).
126 RegisterTypeMapEntry(bsontype.Symbol, tSymbol).
127 RegisterTypeMapEntry(bsontype.CodeWithScope, tCodeWithScope).
128 RegisterTypeMapEntry(bsontype.Int32, tInt32).
129 RegisterTypeMapEntry(bsontype.Int64, tInt64).
130 RegisterTypeMapEntry(bsontype.Timestamp, tTimestamp).
131 RegisterTypeMapEntry(bsontype.Decimal128, tDecimal).
132 RegisterTypeMapEntry(bsontype.MinKey, tMinKey).
133 RegisterTypeMapEntry(bsontype.MaxKey, tMaxKey).
134 RegisterTypeMapEntry(bsontype.Type(0), tD).
135 RegisterTypeMapEntry(bsontype.EmbeddedDocument, tD).
136 RegisterHookDecoder(tValueUnmarshaler, ValueDecoderFunc(dvd.ValueUnmarshalerDecodeValue)).
137 RegisterHookDecoder(tUnmarshaler, ValueDecoderFunc(dvd.UnmarshalerDecodeValue))
138 }
139
140
141
142
143
144 func (dvd DefaultValueDecoders) DDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
145 if !val.IsValid() || !val.CanSet() || val.Type() != tD {
146 return ValueDecoderError{Name: "DDecodeValue", Kinds: []reflect.Kind{reflect.Slice}, Received: val}
147 }
148
149 switch vrType := vr.Type(); vrType {
150 case bsontype.Type(0), bsontype.EmbeddedDocument:
151 dc.Ancestor = tD
152 case bsontype.Null:
153 val.Set(reflect.Zero(val.Type()))
154 return vr.ReadNull()
155 default:
156 return fmt.Errorf("cannot decode %v into a primitive.D", vrType)
157 }
158
159 dr, err := vr.ReadDocument()
160 if err != nil {
161 return err
162 }
163
164 decoder, err := dc.LookupDecoder(tEmpty)
165 if err != nil {
166 return err
167 }
168 tEmptyTypeDecoder, _ := decoder.(typeDecoder)
169
170
171 var elems primitive.D
172 if !val.IsNil() {
173 val.SetLen(0)
174 elems = val.Interface().(primitive.D)
175 } else {
176 elems = make(primitive.D, 0)
177 }
178
179 for {
180 key, elemVr, err := dr.ReadElement()
181 if errors.Is(err, bsonrw.ErrEOD) {
182 break
183 } else if err != nil {
184 return err
185 }
186
187
188 elem, err := decodeTypeOrValueWithInfo(decoder, tEmptyTypeDecoder, dc, elemVr, tEmpty, false)
189 if err != nil {
190 return err
191 }
192
193 elems = append(elems, primitive.E{Key: key, Value: elem.Interface()})
194 }
195
196 val.Set(reflect.ValueOf(elems))
197 return nil
198 }
199
200 func (dvd DefaultValueDecoders) booleanDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
201 if t.Kind() != reflect.Bool {
202 return emptyValue, ValueDecoderError{
203 Name: "BooleanDecodeValue",
204 Kinds: []reflect.Kind{reflect.Bool},
205 Received: reflect.Zero(t),
206 }
207 }
208
209 var b bool
210 var err error
211 switch vrType := vr.Type(); vrType {
212 case bsontype.Int32:
213 i32, err := vr.ReadInt32()
214 if err != nil {
215 return emptyValue, err
216 }
217 b = (i32 != 0)
218 case bsontype.Int64:
219 i64, err := vr.ReadInt64()
220 if err != nil {
221 return emptyValue, err
222 }
223 b = (i64 != 0)
224 case bsontype.Double:
225 f64, err := vr.ReadDouble()
226 if err != nil {
227 return emptyValue, err
228 }
229 b = (f64 != 0)
230 case bsontype.Boolean:
231 b, err = vr.ReadBoolean()
232 case bsontype.Null:
233 err = vr.ReadNull()
234 case bsontype.Undefined:
235 err = vr.ReadUndefined()
236 default:
237 return emptyValue, fmt.Errorf("cannot decode %v into a boolean", vrType)
238 }
239 if err != nil {
240 return emptyValue, err
241 }
242
243 return reflect.ValueOf(b), nil
244 }
245
246
247
248
249
250 func (dvd DefaultValueDecoders) BooleanDecodeValue(dctx DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
251 if !val.IsValid() || !val.CanSet() || val.Kind() != reflect.Bool {
252 return ValueDecoderError{Name: "BooleanDecodeValue", Kinds: []reflect.Kind{reflect.Bool}, Received: val}
253 }
254
255 elem, err := dvd.booleanDecodeType(dctx, vr, val.Type())
256 if err != nil {
257 return err
258 }
259
260 val.SetBool(elem.Bool())
261 return nil
262 }
263
264 func (DefaultValueDecoders) intDecodeType(dc DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
265 var i64 int64
266 var err error
267 switch vrType := vr.Type(); vrType {
268 case bsontype.Int32:
269 i32, err := vr.ReadInt32()
270 if err != nil {
271 return emptyValue, err
272 }
273 i64 = int64(i32)
274 case bsontype.Int64:
275 i64, err = vr.ReadInt64()
276 if err != nil {
277 return emptyValue, err
278 }
279 case bsontype.Double:
280 f64, err := vr.ReadDouble()
281 if err != nil {
282 return emptyValue, err
283 }
284 if !dc.Truncate && math.Floor(f64) != f64 {
285 return emptyValue, errCannotTruncate
286 }
287 if f64 > float64(math.MaxInt64) {
288 return emptyValue, fmt.Errorf("%g overflows int64", f64)
289 }
290 i64 = int64(f64)
291 case bsontype.Boolean:
292 b, err := vr.ReadBoolean()
293 if err != nil {
294 return emptyValue, err
295 }
296 if b {
297 i64 = 1
298 }
299 case bsontype.Null:
300 if err = vr.ReadNull(); err != nil {
301 return emptyValue, err
302 }
303 case bsontype.Undefined:
304 if err = vr.ReadUndefined(); err != nil {
305 return emptyValue, err
306 }
307 default:
308 return emptyValue, fmt.Errorf("cannot decode %v into an integer type", vrType)
309 }
310
311 switch t.Kind() {
312 case reflect.Int8:
313 if i64 < math.MinInt8 || i64 > math.MaxInt8 {
314 return emptyValue, fmt.Errorf("%d overflows int8", i64)
315 }
316
317 return reflect.ValueOf(int8(i64)), nil
318 case reflect.Int16:
319 if i64 < math.MinInt16 || i64 > math.MaxInt16 {
320 return emptyValue, fmt.Errorf("%d overflows int16", i64)
321 }
322
323 return reflect.ValueOf(int16(i64)), nil
324 case reflect.Int32:
325 if i64 < math.MinInt32 || i64 > math.MaxInt32 {
326 return emptyValue, fmt.Errorf("%d overflows int32", i64)
327 }
328
329 return reflect.ValueOf(int32(i64)), nil
330 case reflect.Int64:
331 return reflect.ValueOf(i64), nil
332 case reflect.Int:
333 if int64(int(i64)) != i64 {
334 return emptyValue, fmt.Errorf("%d overflows int", i64)
335 }
336
337 return reflect.ValueOf(int(i64)), nil
338 default:
339 return emptyValue, ValueDecoderError{
340 Name: "IntDecodeValue",
341 Kinds: []reflect.Kind{reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int},
342 Received: reflect.Zero(t),
343 }
344 }
345 }
346
347
348
349
350
351 func (dvd DefaultValueDecoders) IntDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
352 if !val.CanSet() {
353 return ValueDecoderError{
354 Name: "IntDecodeValue",
355 Kinds: []reflect.Kind{reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int},
356 Received: val,
357 }
358 }
359
360 elem, err := dvd.intDecodeType(dc, vr, val.Type())
361 if err != nil {
362 return err
363 }
364
365 val.SetInt(elem.Int())
366 return nil
367 }
368
369
370
371
372 func (dvd DefaultValueDecoders) UintDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
373 var i64 int64
374 var err error
375 switch vr.Type() {
376 case bsontype.Int32:
377 i32, err := vr.ReadInt32()
378 if err != nil {
379 return err
380 }
381 i64 = int64(i32)
382 case bsontype.Int64:
383 i64, err = vr.ReadInt64()
384 if err != nil {
385 return err
386 }
387 case bsontype.Double:
388 f64, err := vr.ReadDouble()
389 if err != nil {
390 return err
391 }
392 if !dc.Truncate && math.Floor(f64) != f64 {
393 return errors.New("UintDecodeValue can only truncate float64 to an integer type when truncation is enabled")
394 }
395 if f64 > float64(math.MaxInt64) {
396 return fmt.Errorf("%g overflows int64", f64)
397 }
398 i64 = int64(f64)
399 case bsontype.Boolean:
400 b, err := vr.ReadBoolean()
401 if err != nil {
402 return err
403 }
404 if b {
405 i64 = 1
406 }
407 default:
408 return fmt.Errorf("cannot decode %v into an integer type", vr.Type())
409 }
410
411 if !val.CanSet() {
412 return ValueDecoderError{
413 Name: "UintDecodeValue",
414 Kinds: []reflect.Kind{reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint},
415 Received: val,
416 }
417 }
418
419 switch val.Kind() {
420 case reflect.Uint8:
421 if i64 < 0 || i64 > math.MaxUint8 {
422 return fmt.Errorf("%d overflows uint8", i64)
423 }
424 case reflect.Uint16:
425 if i64 < 0 || i64 > math.MaxUint16 {
426 return fmt.Errorf("%d overflows uint16", i64)
427 }
428 case reflect.Uint32:
429 if i64 < 0 || i64 > math.MaxUint32 {
430 return fmt.Errorf("%d overflows uint32", i64)
431 }
432 case reflect.Uint64:
433 if i64 < 0 {
434 return fmt.Errorf("%d overflows uint64", i64)
435 }
436 case reflect.Uint:
437 if i64 < 0 || int64(uint(i64)) != i64 {
438 return fmt.Errorf("%d overflows uint", i64)
439 }
440 default:
441 return ValueDecoderError{
442 Name: "UintDecodeValue",
443 Kinds: []reflect.Kind{reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint},
444 Received: val,
445 }
446 }
447
448 val.SetUint(uint64(i64))
449 return nil
450 }
451
452 func (dvd DefaultValueDecoders) floatDecodeType(dc DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
453 var f float64
454 var err error
455 switch vrType := vr.Type(); vrType {
456 case bsontype.Int32:
457 i32, err := vr.ReadInt32()
458 if err != nil {
459 return emptyValue, err
460 }
461 f = float64(i32)
462 case bsontype.Int64:
463 i64, err := vr.ReadInt64()
464 if err != nil {
465 return emptyValue, err
466 }
467 f = float64(i64)
468 case bsontype.Double:
469 f, err = vr.ReadDouble()
470 if err != nil {
471 return emptyValue, err
472 }
473 case bsontype.Boolean:
474 b, err := vr.ReadBoolean()
475 if err != nil {
476 return emptyValue, err
477 }
478 if b {
479 f = 1
480 }
481 case bsontype.Null:
482 if err = vr.ReadNull(); err != nil {
483 return emptyValue, err
484 }
485 case bsontype.Undefined:
486 if err = vr.ReadUndefined(); err != nil {
487 return emptyValue, err
488 }
489 default:
490 return emptyValue, fmt.Errorf("cannot decode %v into a float32 or float64 type", vrType)
491 }
492
493 switch t.Kind() {
494 case reflect.Float32:
495 if !dc.Truncate && float64(float32(f)) != f {
496 return emptyValue, errCannotTruncate
497 }
498
499 return reflect.ValueOf(float32(f)), nil
500 case reflect.Float64:
501 return reflect.ValueOf(f), nil
502 default:
503 return emptyValue, ValueDecoderError{
504 Name: "FloatDecodeValue",
505 Kinds: []reflect.Kind{reflect.Float32, reflect.Float64},
506 Received: reflect.Zero(t),
507 }
508 }
509 }
510
511
512
513
514
515 func (dvd DefaultValueDecoders) FloatDecodeValue(ec DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
516 if !val.CanSet() {
517 return ValueDecoderError{
518 Name: "FloatDecodeValue",
519 Kinds: []reflect.Kind{reflect.Float32, reflect.Float64},
520 Received: val,
521 }
522 }
523
524 elem, err := dvd.floatDecodeType(ec, vr, val.Type())
525 if err != nil {
526 return err
527 }
528
529 val.SetFloat(elem.Float())
530 return nil
531 }
532
533
534
535
536 func (dvd DefaultValueDecoders) StringDecodeValue(_ DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
537 var str string
538 var err error
539 switch vr.Type() {
540
541 case bsontype.String:
542 str, err = vr.ReadString()
543 if err != nil {
544 return err
545 }
546 default:
547 return fmt.Errorf("cannot decode %v into a string type", vr.Type())
548 }
549 if !val.CanSet() || val.Kind() != reflect.String {
550 return ValueDecoderError{Name: "StringDecodeValue", Kinds: []reflect.Kind{reflect.String}, Received: val}
551 }
552
553 val.SetString(str)
554 return nil
555 }
556
557 func (DefaultValueDecoders) javaScriptDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
558 if t != tJavaScript {
559 return emptyValue, ValueDecoderError{
560 Name: "JavaScriptDecodeValue",
561 Types: []reflect.Type{tJavaScript},
562 Received: reflect.Zero(t),
563 }
564 }
565
566 var js string
567 var err error
568 switch vrType := vr.Type(); vrType {
569 case bsontype.JavaScript:
570 js, err = vr.ReadJavascript()
571 case bsontype.Null:
572 err = vr.ReadNull()
573 case bsontype.Undefined:
574 err = vr.ReadUndefined()
575 default:
576 return emptyValue, fmt.Errorf("cannot decode %v into a primitive.JavaScript", vrType)
577 }
578 if err != nil {
579 return emptyValue, err
580 }
581
582 return reflect.ValueOf(primitive.JavaScript(js)), nil
583 }
584
585
586
587
588
589 func (dvd DefaultValueDecoders) JavaScriptDecodeValue(dctx DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
590 if !val.CanSet() || val.Type() != tJavaScript {
591 return ValueDecoderError{Name: "JavaScriptDecodeValue", Types: []reflect.Type{tJavaScript}, Received: val}
592 }
593
594 elem, err := dvd.javaScriptDecodeType(dctx, vr, tJavaScript)
595 if err != nil {
596 return err
597 }
598
599 val.SetString(elem.String())
600 return nil
601 }
602
603 func (DefaultValueDecoders) symbolDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
604 if t != tSymbol {
605 return emptyValue, ValueDecoderError{
606 Name: "SymbolDecodeValue",
607 Types: []reflect.Type{tSymbol},
608 Received: reflect.Zero(t),
609 }
610 }
611
612 var symbol string
613 var err error
614 switch vrType := vr.Type(); vrType {
615 case bsontype.String:
616 symbol, err = vr.ReadString()
617 case bsontype.Symbol:
618 symbol, err = vr.ReadSymbol()
619 case bsontype.Binary:
620 data, subtype, err := vr.ReadBinary()
621 if err != nil {
622 return emptyValue, err
623 }
624
625 if subtype != bsontype.BinaryGeneric && subtype != bsontype.BinaryBinaryOld {
626 return emptyValue, decodeBinaryError{subtype: subtype, typeName: "primitive.Symbol"}
627 }
628 symbol = string(data)
629 case bsontype.Null:
630 err = vr.ReadNull()
631 case bsontype.Undefined:
632 err = vr.ReadUndefined()
633 default:
634 return emptyValue, fmt.Errorf("cannot decode %v into a primitive.Symbol", vrType)
635 }
636 if err != nil {
637 return emptyValue, err
638 }
639
640 return reflect.ValueOf(primitive.Symbol(symbol)), nil
641 }
642
643
644
645
646
647 func (dvd DefaultValueDecoders) SymbolDecodeValue(dctx DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
648 if !val.CanSet() || val.Type() != tSymbol {
649 return ValueDecoderError{Name: "SymbolDecodeValue", Types: []reflect.Type{tSymbol}, Received: val}
650 }
651
652 elem, err := dvd.symbolDecodeType(dctx, vr, tSymbol)
653 if err != nil {
654 return err
655 }
656
657 val.SetString(elem.String())
658 return nil
659 }
660
661 func (DefaultValueDecoders) binaryDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
662 if t != tBinary {
663 return emptyValue, ValueDecoderError{
664 Name: "BinaryDecodeValue",
665 Types: []reflect.Type{tBinary},
666 Received: reflect.Zero(t),
667 }
668 }
669
670 var data []byte
671 var subtype byte
672 var err error
673 switch vrType := vr.Type(); vrType {
674 case bsontype.Binary:
675 data, subtype, err = vr.ReadBinary()
676 case bsontype.Null:
677 err = vr.ReadNull()
678 case bsontype.Undefined:
679 err = vr.ReadUndefined()
680 default:
681 return emptyValue, fmt.Errorf("cannot decode %v into a Binary", vrType)
682 }
683 if err != nil {
684 return emptyValue, err
685 }
686
687 return reflect.ValueOf(primitive.Binary{Subtype: subtype, Data: data}), nil
688 }
689
690
691
692
693
694 func (dvd DefaultValueDecoders) BinaryDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
695 if !val.CanSet() || val.Type() != tBinary {
696 return ValueDecoderError{Name: "BinaryDecodeValue", Types: []reflect.Type{tBinary}, Received: val}
697 }
698
699 elem, err := dvd.binaryDecodeType(dc, vr, tBinary)
700 if err != nil {
701 return err
702 }
703
704 val.Set(elem)
705 return nil
706 }
707
708 func (DefaultValueDecoders) undefinedDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
709 if t != tUndefined {
710 return emptyValue, ValueDecoderError{
711 Name: "UndefinedDecodeValue",
712 Types: []reflect.Type{tUndefined},
713 Received: reflect.Zero(t),
714 }
715 }
716
717 var err error
718 switch vrType := vr.Type(); vrType {
719 case bsontype.Undefined:
720 err = vr.ReadUndefined()
721 case bsontype.Null:
722 err = vr.ReadNull()
723 default:
724 return emptyValue, fmt.Errorf("cannot decode %v into an Undefined", vr.Type())
725 }
726 if err != nil {
727 return emptyValue, err
728 }
729
730 return reflect.ValueOf(primitive.Undefined{}), nil
731 }
732
733
734
735
736
737 func (dvd DefaultValueDecoders) UndefinedDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
738 if !val.CanSet() || val.Type() != tUndefined {
739 return ValueDecoderError{Name: "UndefinedDecodeValue", Types: []reflect.Type{tUndefined}, Received: val}
740 }
741
742 elem, err := dvd.undefinedDecodeType(dc, vr, tUndefined)
743 if err != nil {
744 return err
745 }
746
747 val.Set(elem)
748 return nil
749 }
750
751
752 func (dvd DefaultValueDecoders) objectIDDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
753 if t != tOID {
754 return emptyValue, ValueDecoderError{
755 Name: "ObjectIDDecodeValue",
756 Types: []reflect.Type{tOID},
757 Received: reflect.Zero(t),
758 }
759 }
760
761 var oid primitive.ObjectID
762 var err error
763 switch vrType := vr.Type(); vrType {
764 case bsontype.ObjectID:
765 oid, err = vr.ReadObjectID()
766 if err != nil {
767 return emptyValue, err
768 }
769 case bsontype.String:
770 str, err := vr.ReadString()
771 if err != nil {
772 return emptyValue, err
773 }
774 if oid, err = primitive.ObjectIDFromHex(str); err == nil {
775 break
776 }
777 if len(str) != 12 {
778 return emptyValue, fmt.Errorf("an ObjectID string must be exactly 12 bytes long (got %v)", len(str))
779 }
780 byteArr := []byte(str)
781 copy(oid[:], byteArr)
782 case bsontype.Null:
783 if err = vr.ReadNull(); err != nil {
784 return emptyValue, err
785 }
786 case bsontype.Undefined:
787 if err = vr.ReadUndefined(); err != nil {
788 return emptyValue, err
789 }
790 default:
791 return emptyValue, fmt.Errorf("cannot decode %v into an ObjectID", vrType)
792 }
793
794 return reflect.ValueOf(oid), nil
795 }
796
797
798
799
800
801 func (dvd DefaultValueDecoders) ObjectIDDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
802 if !val.CanSet() || val.Type() != tOID {
803 return ValueDecoderError{Name: "ObjectIDDecodeValue", Types: []reflect.Type{tOID}, Received: val}
804 }
805
806 elem, err := dvd.objectIDDecodeType(dc, vr, tOID)
807 if err != nil {
808 return err
809 }
810
811 val.Set(elem)
812 return nil
813 }
814
815 func (DefaultValueDecoders) dateTimeDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
816 if t != tDateTime {
817 return emptyValue, ValueDecoderError{
818 Name: "DateTimeDecodeValue",
819 Types: []reflect.Type{tDateTime},
820 Received: reflect.Zero(t),
821 }
822 }
823
824 var dt int64
825 var err error
826 switch vrType := vr.Type(); vrType {
827 case bsontype.DateTime:
828 dt, err = vr.ReadDateTime()
829 case bsontype.Null:
830 err = vr.ReadNull()
831 case bsontype.Undefined:
832 err = vr.ReadUndefined()
833 default:
834 return emptyValue, fmt.Errorf("cannot decode %v into a DateTime", vrType)
835 }
836 if err != nil {
837 return emptyValue, err
838 }
839
840 return reflect.ValueOf(primitive.DateTime(dt)), nil
841 }
842
843
844
845
846
847 func (dvd DefaultValueDecoders) DateTimeDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
848 if !val.CanSet() || val.Type() != tDateTime {
849 return ValueDecoderError{Name: "DateTimeDecodeValue", Types: []reflect.Type{tDateTime}, Received: val}
850 }
851
852 elem, err := dvd.dateTimeDecodeType(dc, vr, tDateTime)
853 if err != nil {
854 return err
855 }
856
857 val.Set(elem)
858 return nil
859 }
860
861 func (DefaultValueDecoders) nullDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
862 if t != tNull {
863 return emptyValue, ValueDecoderError{
864 Name: "NullDecodeValue",
865 Types: []reflect.Type{tNull},
866 Received: reflect.Zero(t),
867 }
868 }
869
870 var err error
871 switch vrType := vr.Type(); vrType {
872 case bsontype.Undefined:
873 err = vr.ReadUndefined()
874 case bsontype.Null:
875 err = vr.ReadNull()
876 default:
877 return emptyValue, fmt.Errorf("cannot decode %v into a Null", vr.Type())
878 }
879 if err != nil {
880 return emptyValue, err
881 }
882
883 return reflect.ValueOf(primitive.Null{}), nil
884 }
885
886
887
888
889
890 func (dvd DefaultValueDecoders) NullDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
891 if !val.CanSet() || val.Type() != tNull {
892 return ValueDecoderError{Name: "NullDecodeValue", Types: []reflect.Type{tNull}, Received: val}
893 }
894
895 elem, err := dvd.nullDecodeType(dc, vr, tNull)
896 if err != nil {
897 return err
898 }
899
900 val.Set(elem)
901 return nil
902 }
903
904 func (DefaultValueDecoders) regexDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
905 if t != tRegex {
906 return emptyValue, ValueDecoderError{
907 Name: "RegexDecodeValue",
908 Types: []reflect.Type{tRegex},
909 Received: reflect.Zero(t),
910 }
911 }
912
913 var pattern, options string
914 var err error
915 switch vrType := vr.Type(); vrType {
916 case bsontype.Regex:
917 pattern, options, err = vr.ReadRegex()
918 case bsontype.Null:
919 err = vr.ReadNull()
920 case bsontype.Undefined:
921 err = vr.ReadUndefined()
922 default:
923 return emptyValue, fmt.Errorf("cannot decode %v into a Regex", vrType)
924 }
925 if err != nil {
926 return emptyValue, err
927 }
928
929 return reflect.ValueOf(primitive.Regex{Pattern: pattern, Options: options}), nil
930 }
931
932
933
934
935
936 func (dvd DefaultValueDecoders) RegexDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
937 if !val.CanSet() || val.Type() != tRegex {
938 return ValueDecoderError{Name: "RegexDecodeValue", Types: []reflect.Type{tRegex}, Received: val}
939 }
940
941 elem, err := dvd.regexDecodeType(dc, vr, tRegex)
942 if err != nil {
943 return err
944 }
945
946 val.Set(elem)
947 return nil
948 }
949
950 func (DefaultValueDecoders) dBPointerDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
951 if t != tDBPointer {
952 return emptyValue, ValueDecoderError{
953 Name: "DBPointerDecodeValue",
954 Types: []reflect.Type{tDBPointer},
955 Received: reflect.Zero(t),
956 }
957 }
958
959 var ns string
960 var pointer primitive.ObjectID
961 var err error
962 switch vrType := vr.Type(); vrType {
963 case bsontype.DBPointer:
964 ns, pointer, err = vr.ReadDBPointer()
965 case bsontype.Null:
966 err = vr.ReadNull()
967 case bsontype.Undefined:
968 err = vr.ReadUndefined()
969 default:
970 return emptyValue, fmt.Errorf("cannot decode %v into a DBPointer", vrType)
971 }
972 if err != nil {
973 return emptyValue, err
974 }
975
976 return reflect.ValueOf(primitive.DBPointer{DB: ns, Pointer: pointer}), nil
977 }
978
979
980
981
982
983 func (dvd DefaultValueDecoders) DBPointerDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
984 if !val.CanSet() || val.Type() != tDBPointer {
985 return ValueDecoderError{Name: "DBPointerDecodeValue", Types: []reflect.Type{tDBPointer}, Received: val}
986 }
987
988 elem, err := dvd.dBPointerDecodeType(dc, vr, tDBPointer)
989 if err != nil {
990 return err
991 }
992
993 val.Set(elem)
994 return nil
995 }
996
997 func (DefaultValueDecoders) timestampDecodeType(_ DecodeContext, vr bsonrw.ValueReader, reflectType reflect.Type) (reflect.Value, error) {
998 if reflectType != tTimestamp {
999 return emptyValue, ValueDecoderError{
1000 Name: "TimestampDecodeValue",
1001 Types: []reflect.Type{tTimestamp},
1002 Received: reflect.Zero(reflectType),
1003 }
1004 }
1005
1006 var t, incr uint32
1007 var err error
1008 switch vrType := vr.Type(); vrType {
1009 case bsontype.Timestamp:
1010 t, incr, err = vr.ReadTimestamp()
1011 case bsontype.Null:
1012 err = vr.ReadNull()
1013 case bsontype.Undefined:
1014 err = vr.ReadUndefined()
1015 default:
1016 return emptyValue, fmt.Errorf("cannot decode %v into a Timestamp", vrType)
1017 }
1018 if err != nil {
1019 return emptyValue, err
1020 }
1021
1022 return reflect.ValueOf(primitive.Timestamp{T: t, I: incr}), nil
1023 }
1024
1025
1026
1027
1028
1029 func (dvd DefaultValueDecoders) TimestampDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
1030 if !val.CanSet() || val.Type() != tTimestamp {
1031 return ValueDecoderError{Name: "TimestampDecodeValue", Types: []reflect.Type{tTimestamp}, Received: val}
1032 }
1033
1034 elem, err := dvd.timestampDecodeType(dc, vr, tTimestamp)
1035 if err != nil {
1036 return err
1037 }
1038
1039 val.Set(elem)
1040 return nil
1041 }
1042
1043 func (DefaultValueDecoders) minKeyDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
1044 if t != tMinKey {
1045 return emptyValue, ValueDecoderError{
1046 Name: "MinKeyDecodeValue",
1047 Types: []reflect.Type{tMinKey},
1048 Received: reflect.Zero(t),
1049 }
1050 }
1051
1052 var err error
1053 switch vrType := vr.Type(); vrType {
1054 case bsontype.MinKey:
1055 err = vr.ReadMinKey()
1056 case bsontype.Null:
1057 err = vr.ReadNull()
1058 case bsontype.Undefined:
1059 err = vr.ReadUndefined()
1060 default:
1061 return emptyValue, fmt.Errorf("cannot decode %v into a MinKey", vr.Type())
1062 }
1063 if err != nil {
1064 return emptyValue, err
1065 }
1066
1067 return reflect.ValueOf(primitive.MinKey{}), nil
1068 }
1069
1070
1071
1072
1073
1074 func (dvd DefaultValueDecoders) MinKeyDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
1075 if !val.CanSet() || val.Type() != tMinKey {
1076 return ValueDecoderError{Name: "MinKeyDecodeValue", Types: []reflect.Type{tMinKey}, Received: val}
1077 }
1078
1079 elem, err := dvd.minKeyDecodeType(dc, vr, tMinKey)
1080 if err != nil {
1081 return err
1082 }
1083
1084 val.Set(elem)
1085 return nil
1086 }
1087
1088 func (DefaultValueDecoders) maxKeyDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
1089 if t != tMaxKey {
1090 return emptyValue, ValueDecoderError{
1091 Name: "MaxKeyDecodeValue",
1092 Types: []reflect.Type{tMaxKey},
1093 Received: reflect.Zero(t),
1094 }
1095 }
1096
1097 var err error
1098 switch vrType := vr.Type(); vrType {
1099 case bsontype.MaxKey:
1100 err = vr.ReadMaxKey()
1101 case bsontype.Null:
1102 err = vr.ReadNull()
1103 case bsontype.Undefined:
1104 err = vr.ReadUndefined()
1105 default:
1106 return emptyValue, fmt.Errorf("cannot decode %v into a MaxKey", vr.Type())
1107 }
1108 if err != nil {
1109 return emptyValue, err
1110 }
1111
1112 return reflect.ValueOf(primitive.MaxKey{}), nil
1113 }
1114
1115
1116
1117
1118
1119 func (dvd DefaultValueDecoders) MaxKeyDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
1120 if !val.CanSet() || val.Type() != tMaxKey {
1121 return ValueDecoderError{Name: "MaxKeyDecodeValue", Types: []reflect.Type{tMaxKey}, Received: val}
1122 }
1123
1124 elem, err := dvd.maxKeyDecodeType(dc, vr, tMaxKey)
1125 if err != nil {
1126 return err
1127 }
1128
1129 val.Set(elem)
1130 return nil
1131 }
1132
1133 func (dvd DefaultValueDecoders) decimal128DecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
1134 if t != tDecimal {
1135 return emptyValue, ValueDecoderError{
1136 Name: "Decimal128DecodeValue",
1137 Types: []reflect.Type{tDecimal},
1138 Received: reflect.Zero(t),
1139 }
1140 }
1141
1142 var d128 primitive.Decimal128
1143 var err error
1144 switch vrType := vr.Type(); vrType {
1145 case bsontype.Decimal128:
1146 d128, err = vr.ReadDecimal128()
1147 case bsontype.Null:
1148 err = vr.ReadNull()
1149 case bsontype.Undefined:
1150 err = vr.ReadUndefined()
1151 default:
1152 return emptyValue, fmt.Errorf("cannot decode %v into a primitive.Decimal128", vr.Type())
1153 }
1154 if err != nil {
1155 return emptyValue, err
1156 }
1157
1158 return reflect.ValueOf(d128), nil
1159 }
1160
1161
1162
1163
1164
1165 func (dvd DefaultValueDecoders) Decimal128DecodeValue(dctx DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
1166 if !val.CanSet() || val.Type() != tDecimal {
1167 return ValueDecoderError{Name: "Decimal128DecodeValue", Types: []reflect.Type{tDecimal}, Received: val}
1168 }
1169
1170 elem, err := dvd.decimal128DecodeType(dctx, vr, tDecimal)
1171 if err != nil {
1172 return err
1173 }
1174
1175 val.Set(elem)
1176 return nil
1177 }
1178
1179 func (dvd DefaultValueDecoders) jsonNumberDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
1180 if t != tJSONNumber {
1181 return emptyValue, ValueDecoderError{
1182 Name: "JSONNumberDecodeValue",
1183 Types: []reflect.Type{tJSONNumber},
1184 Received: reflect.Zero(t),
1185 }
1186 }
1187
1188 var jsonNum json.Number
1189 var err error
1190 switch vrType := vr.Type(); vrType {
1191 case bsontype.Double:
1192 f64, err := vr.ReadDouble()
1193 if err != nil {
1194 return emptyValue, err
1195 }
1196 jsonNum = json.Number(strconv.FormatFloat(f64, 'f', -1, 64))
1197 case bsontype.Int32:
1198 i32, err := vr.ReadInt32()
1199 if err != nil {
1200 return emptyValue, err
1201 }
1202 jsonNum = json.Number(strconv.FormatInt(int64(i32), 10))
1203 case bsontype.Int64:
1204 i64, err := vr.ReadInt64()
1205 if err != nil {
1206 return emptyValue, err
1207 }
1208 jsonNum = json.Number(strconv.FormatInt(i64, 10))
1209 case bsontype.Null:
1210 err = vr.ReadNull()
1211 case bsontype.Undefined:
1212 err = vr.ReadUndefined()
1213 default:
1214 return emptyValue, fmt.Errorf("cannot decode %v into a json.Number", vrType)
1215 }
1216 if err != nil {
1217 return emptyValue, err
1218 }
1219
1220 return reflect.ValueOf(jsonNum), nil
1221 }
1222
1223
1224
1225
1226
1227 func (dvd DefaultValueDecoders) JSONNumberDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
1228 if !val.CanSet() || val.Type() != tJSONNumber {
1229 return ValueDecoderError{Name: "JSONNumberDecodeValue", Types: []reflect.Type{tJSONNumber}, Received: val}
1230 }
1231
1232 elem, err := dvd.jsonNumberDecodeType(dc, vr, tJSONNumber)
1233 if err != nil {
1234 return err
1235 }
1236
1237 val.Set(elem)
1238 return nil
1239 }
1240
1241 func (dvd DefaultValueDecoders) urlDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
1242 if t != tURL {
1243 return emptyValue, ValueDecoderError{
1244 Name: "URLDecodeValue",
1245 Types: []reflect.Type{tURL},
1246 Received: reflect.Zero(t),
1247 }
1248 }
1249
1250 urlPtr := &url.URL{}
1251 var err error
1252 switch vrType := vr.Type(); vrType {
1253 case bsontype.String:
1254 var str string
1255 str, err = vr.ReadString()
1256 if err != nil {
1257 return emptyValue, err
1258 }
1259
1260 urlPtr, err = url.Parse(str)
1261 case bsontype.Null:
1262 err = vr.ReadNull()
1263 case bsontype.Undefined:
1264 err = vr.ReadUndefined()
1265 default:
1266 return emptyValue, fmt.Errorf("cannot decode %v into a *url.URL", vrType)
1267 }
1268 if err != nil {
1269 return emptyValue, err
1270 }
1271
1272 return reflect.ValueOf(urlPtr).Elem(), nil
1273 }
1274
1275
1276
1277
1278
1279 func (dvd DefaultValueDecoders) URLDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
1280 if !val.CanSet() || val.Type() != tURL {
1281 return ValueDecoderError{Name: "URLDecodeValue", Types: []reflect.Type{tURL}, Received: val}
1282 }
1283
1284 elem, err := dvd.urlDecodeType(dc, vr, tURL)
1285 if err != nil {
1286 return err
1287 }
1288
1289 val.Set(elem)
1290 return nil
1291 }
1292
1293
1294
1295
1296 func (dvd DefaultValueDecoders) TimeDecodeValue(_ DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
1297 if vr.Type() != bsontype.DateTime {
1298 return fmt.Errorf("cannot decode %v into a time.Time", vr.Type())
1299 }
1300
1301 dt, err := vr.ReadDateTime()
1302 if err != nil {
1303 return err
1304 }
1305
1306 if !val.CanSet() || val.Type() != tTime {
1307 return ValueDecoderError{Name: "TimeDecodeValue", Types: []reflect.Type{tTime}, Received: val}
1308 }
1309
1310 val.Set(reflect.ValueOf(time.Unix(dt/1000, dt%1000*1000000).UTC()))
1311 return nil
1312 }
1313
1314
1315
1316
1317 func (dvd DefaultValueDecoders) ByteSliceDecodeValue(_ DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
1318 if vr.Type() != bsontype.Binary && vr.Type() != bsontype.Null {
1319 return fmt.Errorf("cannot decode %v into a []byte", vr.Type())
1320 }
1321
1322 if !val.CanSet() || val.Type() != tByteSlice {
1323 return ValueDecoderError{Name: "ByteSliceDecodeValue", Types: []reflect.Type{tByteSlice}, Received: val}
1324 }
1325
1326 if vr.Type() == bsontype.Null {
1327 val.Set(reflect.Zero(val.Type()))
1328 return vr.ReadNull()
1329 }
1330
1331 data, subtype, err := vr.ReadBinary()
1332 if err != nil {
1333 return err
1334 }
1335 if subtype != 0x00 {
1336 return fmt.Errorf("ByteSliceDecodeValue can only be used to decode subtype 0x00 for %s, got %v", bsontype.Binary, subtype)
1337 }
1338
1339 val.Set(reflect.ValueOf(data))
1340 return nil
1341 }
1342
1343
1344
1345
1346 func (dvd DefaultValueDecoders) MapDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
1347 if !val.CanSet() || val.Kind() != reflect.Map || val.Type().Key().Kind() != reflect.String {
1348 return ValueDecoderError{Name: "MapDecodeValue", Kinds: []reflect.Kind{reflect.Map}, Received: val}
1349 }
1350
1351 switch vr.Type() {
1352 case bsontype.Type(0), bsontype.EmbeddedDocument:
1353 case bsontype.Null:
1354 val.Set(reflect.Zero(val.Type()))
1355 return vr.ReadNull()
1356 default:
1357 return fmt.Errorf("cannot decode %v into a %s", vr.Type(), val.Type())
1358 }
1359
1360 dr, err := vr.ReadDocument()
1361 if err != nil {
1362 return err
1363 }
1364
1365 if val.IsNil() {
1366 val.Set(reflect.MakeMap(val.Type()))
1367 }
1368
1369 eType := val.Type().Elem()
1370 decoder, err := dc.LookupDecoder(eType)
1371 if err != nil {
1372 return err
1373 }
1374
1375 if eType == tEmpty {
1376 dc.Ancestor = val.Type()
1377 }
1378
1379 keyType := val.Type().Key()
1380 for {
1381 key, vr, err := dr.ReadElement()
1382 if errors.Is(err, bsonrw.ErrEOD) {
1383 break
1384 }
1385 if err != nil {
1386 return err
1387 }
1388
1389 elem := reflect.New(eType).Elem()
1390
1391 err = decoder.DecodeValue(dc, vr, elem)
1392 if err != nil {
1393 return err
1394 }
1395
1396 val.SetMapIndex(reflect.ValueOf(key).Convert(keyType), elem)
1397 }
1398 return nil
1399 }
1400
1401
1402
1403
1404
1405 func (dvd DefaultValueDecoders) ArrayDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
1406 if !val.IsValid() || val.Kind() != reflect.Array {
1407 return ValueDecoderError{Name: "ArrayDecodeValue", Kinds: []reflect.Kind{reflect.Array}, Received: val}
1408 }
1409
1410 switch vrType := vr.Type(); vrType {
1411 case bsontype.Array:
1412 case bsontype.Type(0), bsontype.EmbeddedDocument:
1413 if val.Type().Elem() != tE {
1414 return fmt.Errorf("cannot decode document into %s", val.Type())
1415 }
1416 case bsontype.Binary:
1417 if val.Type().Elem() != tByte {
1418 return fmt.Errorf("ArrayDecodeValue can only be used to decode binary into a byte array, got %v", vrType)
1419 }
1420 data, subtype, err := vr.ReadBinary()
1421 if err != nil {
1422 return err
1423 }
1424 if subtype != bsontype.BinaryGeneric && subtype != bsontype.BinaryBinaryOld {
1425 return fmt.Errorf("ArrayDecodeValue can only be used to decode subtype 0x00 or 0x02 for %s, got %v", bsontype.Binary, subtype)
1426 }
1427
1428 if len(data) > val.Len() {
1429 return fmt.Errorf("more elements returned in array than can fit inside %s", val.Type())
1430 }
1431
1432 for idx, elem := range data {
1433 val.Index(idx).Set(reflect.ValueOf(elem))
1434 }
1435 return nil
1436 case bsontype.Null:
1437 val.Set(reflect.Zero(val.Type()))
1438 return vr.ReadNull()
1439 case bsontype.Undefined:
1440 val.Set(reflect.Zero(val.Type()))
1441 return vr.ReadUndefined()
1442 default:
1443 return fmt.Errorf("cannot decode %v into an array", vrType)
1444 }
1445
1446 var elemsFunc func(DecodeContext, bsonrw.ValueReader, reflect.Value) ([]reflect.Value, error)
1447 switch val.Type().Elem() {
1448 case tE:
1449 elemsFunc = dvd.decodeD
1450 default:
1451 elemsFunc = dvd.decodeDefault
1452 }
1453
1454 elems, err := elemsFunc(dc, vr, val)
1455 if err != nil {
1456 return err
1457 }
1458
1459 if len(elems) > val.Len() {
1460 return fmt.Errorf("more elements returned in array than can fit inside %s, got %v elements", val.Type(), len(elems))
1461 }
1462
1463 for idx, elem := range elems {
1464 val.Index(idx).Set(elem)
1465 }
1466
1467 return nil
1468 }
1469
1470
1471
1472
1473 func (dvd DefaultValueDecoders) SliceDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
1474 if !val.CanSet() || val.Kind() != reflect.Slice {
1475 return ValueDecoderError{Name: "SliceDecodeValue", Kinds: []reflect.Kind{reflect.Slice}, Received: val}
1476 }
1477
1478 switch vr.Type() {
1479 case bsontype.Array:
1480 case bsontype.Null:
1481 val.Set(reflect.Zero(val.Type()))
1482 return vr.ReadNull()
1483 case bsontype.Type(0), bsontype.EmbeddedDocument:
1484 if val.Type().Elem() != tE {
1485 return fmt.Errorf("cannot decode document into %s", val.Type())
1486 }
1487 default:
1488 return fmt.Errorf("cannot decode %v into a slice", vr.Type())
1489 }
1490
1491 var elemsFunc func(DecodeContext, bsonrw.ValueReader, reflect.Value) ([]reflect.Value, error)
1492 switch val.Type().Elem() {
1493 case tE:
1494 dc.Ancestor = val.Type()
1495 elemsFunc = dvd.decodeD
1496 default:
1497 elemsFunc = dvd.decodeDefault
1498 }
1499
1500 elems, err := elemsFunc(dc, vr, val)
1501 if err != nil {
1502 return err
1503 }
1504
1505 if val.IsNil() {
1506 val.Set(reflect.MakeSlice(val.Type(), 0, len(elems)))
1507 }
1508
1509 val.SetLen(0)
1510 val.Set(reflect.Append(val, elems...))
1511
1512 return nil
1513 }
1514
1515
1516
1517
1518
1519 func (dvd DefaultValueDecoders) ValueUnmarshalerDecodeValue(_ DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
1520 if !val.IsValid() || (!val.Type().Implements(tValueUnmarshaler) && !reflect.PtrTo(val.Type()).Implements(tValueUnmarshaler)) {
1521 return ValueDecoderError{Name: "ValueUnmarshalerDecodeValue", Types: []reflect.Type{tValueUnmarshaler}, Received: val}
1522 }
1523
1524 if val.Kind() == reflect.Ptr && val.IsNil() {
1525 if !val.CanSet() {
1526 return ValueDecoderError{Name: "ValueUnmarshalerDecodeValue", Types: []reflect.Type{tValueUnmarshaler}, Received: val}
1527 }
1528 val.Set(reflect.New(val.Type().Elem()))
1529 }
1530
1531 if !val.Type().Implements(tValueUnmarshaler) {
1532 if !val.CanAddr() {
1533 return ValueDecoderError{Name: "ValueUnmarshalerDecodeValue", Types: []reflect.Type{tValueUnmarshaler}, Received: val}
1534 }
1535 val = val.Addr()
1536 }
1537
1538 t, src, err := bsonrw.Copier{}.CopyValueToBytes(vr)
1539 if err != nil {
1540 return err
1541 }
1542
1543 m, ok := val.Interface().(ValueUnmarshaler)
1544 if !ok {
1545
1546 return ValueDecoderError{Name: "ValueUnmarshalerDecodeValue", Types: []reflect.Type{tValueUnmarshaler}, Received: val}
1547 }
1548 return m.UnmarshalBSONValue(t, src)
1549 }
1550
1551
1552
1553
1554
1555 func (dvd DefaultValueDecoders) UnmarshalerDecodeValue(_ DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
1556 if !val.IsValid() || (!val.Type().Implements(tUnmarshaler) && !reflect.PtrTo(val.Type()).Implements(tUnmarshaler)) {
1557 return ValueDecoderError{Name: "UnmarshalerDecodeValue", Types: []reflect.Type{tUnmarshaler}, Received: val}
1558 }
1559
1560 if val.Kind() == reflect.Ptr && val.IsNil() {
1561 if !val.CanSet() {
1562 return ValueDecoderError{Name: "UnmarshalerDecodeValue", Types: []reflect.Type{tUnmarshaler}, Received: val}
1563 }
1564 val.Set(reflect.New(val.Type().Elem()))
1565 }
1566
1567 _, src, err := bsonrw.Copier{}.CopyValueToBytes(vr)
1568 if err != nil {
1569 return err
1570 }
1571
1572
1573
1574
1575
1576
1577
1578
1579 if val.Kind() == reflect.Ptr && len(src) == 0 {
1580 val.Set(reflect.Zero(val.Type()))
1581 return nil
1582 }
1583
1584 if !val.Type().Implements(tUnmarshaler) {
1585 if !val.CanAddr() {
1586 return ValueDecoderError{Name: "UnmarshalerDecodeValue", Types: []reflect.Type{tUnmarshaler}, Received: val}
1587 }
1588 val = val.Addr()
1589 }
1590
1591 m, ok := val.Interface().(Unmarshaler)
1592 if !ok {
1593
1594 return ValueDecoderError{Name: "UnmarshalerDecodeValue", Types: []reflect.Type{tUnmarshaler}, Received: val}
1595 }
1596 return m.UnmarshalBSON(src)
1597 }
1598
1599
1600
1601
1602 func (dvd DefaultValueDecoders) EmptyInterfaceDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
1603 if !val.CanSet() || val.Type() != tEmpty {
1604 return ValueDecoderError{Name: "EmptyInterfaceDecodeValue", Types: []reflect.Type{tEmpty}, Received: val}
1605 }
1606
1607 rtype, err := dc.LookupTypeMapEntry(vr.Type())
1608 if err != nil {
1609 switch vr.Type() {
1610 case bsontype.EmbeddedDocument:
1611 if dc.Ancestor != nil {
1612 rtype = dc.Ancestor
1613 break
1614 }
1615 rtype = tD
1616 case bsontype.Null:
1617 val.Set(reflect.Zero(val.Type()))
1618 return vr.ReadNull()
1619 default:
1620 return err
1621 }
1622 }
1623
1624 decoder, err := dc.LookupDecoder(rtype)
1625 if err != nil {
1626 return err
1627 }
1628
1629 elem := reflect.New(rtype).Elem()
1630 err = decoder.DecodeValue(dc, vr, elem)
1631 if err != nil {
1632 return err
1633 }
1634
1635 val.Set(elem)
1636 return nil
1637 }
1638
1639
1640
1641
1642
1643 func (DefaultValueDecoders) CoreDocumentDecodeValue(_ DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
1644 if !val.CanSet() || val.Type() != tCoreDocument {
1645 return ValueDecoderError{Name: "CoreDocumentDecodeValue", Types: []reflect.Type{tCoreDocument}, Received: val}
1646 }
1647
1648 if val.IsNil() {
1649 val.Set(reflect.MakeSlice(val.Type(), 0, 0))
1650 }
1651
1652 val.SetLen(0)
1653
1654 cdoc, err := bsonrw.Copier{}.AppendDocumentBytes(val.Interface().(bsoncore.Document), vr)
1655 val.Set(reflect.ValueOf(cdoc))
1656 return err
1657 }
1658
1659 func (dvd DefaultValueDecoders) decodeDefault(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) ([]reflect.Value, error) {
1660 elems := make([]reflect.Value, 0)
1661
1662 ar, err := vr.ReadArray()
1663 if err != nil {
1664 return nil, err
1665 }
1666
1667 eType := val.Type().Elem()
1668
1669 decoder, err := dc.LookupDecoder(eType)
1670 if err != nil {
1671 return nil, err
1672 }
1673 eTypeDecoder, _ := decoder.(typeDecoder)
1674
1675 idx := 0
1676 for {
1677 vr, err := ar.ReadValue()
1678 if errors.Is(err, bsonrw.ErrEOA) {
1679 break
1680 }
1681 if err != nil {
1682 return nil, err
1683 }
1684
1685 elem, err := decodeTypeOrValueWithInfo(decoder, eTypeDecoder, dc, vr, eType, true)
1686 if err != nil {
1687 return nil, newDecodeError(strconv.Itoa(idx), err)
1688 }
1689 elems = append(elems, elem)
1690 idx++
1691 }
1692
1693 return elems, nil
1694 }
1695
1696 func (dvd DefaultValueDecoders) readCodeWithScope(dc DecodeContext, vr bsonrw.ValueReader) (primitive.CodeWithScope, error) {
1697 var cws primitive.CodeWithScope
1698
1699 code, dr, err := vr.ReadCodeWithScope()
1700 if err != nil {
1701 return cws, err
1702 }
1703
1704 scope := reflect.New(tD).Elem()
1705 elems, err := dvd.decodeElemsFromDocumentReader(dc, dr)
1706 if err != nil {
1707 return cws, err
1708 }
1709
1710 scope.Set(reflect.MakeSlice(tD, 0, len(elems)))
1711 scope.Set(reflect.Append(scope, elems...))
1712
1713 cws = primitive.CodeWithScope{
1714 Code: primitive.JavaScript(code),
1715 Scope: scope.Interface().(primitive.D),
1716 }
1717 return cws, nil
1718 }
1719
1720 func (dvd DefaultValueDecoders) codeWithScopeDecodeType(dc DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
1721 if t != tCodeWithScope {
1722 return emptyValue, ValueDecoderError{
1723 Name: "CodeWithScopeDecodeValue",
1724 Types: []reflect.Type{tCodeWithScope},
1725 Received: reflect.Zero(t),
1726 }
1727 }
1728
1729 var cws primitive.CodeWithScope
1730 var err error
1731 switch vrType := vr.Type(); vrType {
1732 case bsontype.CodeWithScope:
1733 cws, err = dvd.readCodeWithScope(dc, vr)
1734 case bsontype.Null:
1735 err = vr.ReadNull()
1736 case bsontype.Undefined:
1737 err = vr.ReadUndefined()
1738 default:
1739 return emptyValue, fmt.Errorf("cannot decode %v into a primitive.CodeWithScope", vrType)
1740 }
1741 if err != nil {
1742 return emptyValue, err
1743 }
1744
1745 return reflect.ValueOf(cws), nil
1746 }
1747
1748
1749
1750
1751
1752 func (dvd DefaultValueDecoders) CodeWithScopeDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
1753 if !val.CanSet() || val.Type() != tCodeWithScope {
1754 return ValueDecoderError{Name: "CodeWithScopeDecodeValue", Types: []reflect.Type{tCodeWithScope}, Received: val}
1755 }
1756
1757 elem, err := dvd.codeWithScopeDecodeType(dc, vr, tCodeWithScope)
1758 if err != nil {
1759 return err
1760 }
1761
1762 val.Set(elem)
1763 return nil
1764 }
1765
1766 func (dvd DefaultValueDecoders) decodeD(dc DecodeContext, vr bsonrw.ValueReader, _ reflect.Value) ([]reflect.Value, error) {
1767 switch vr.Type() {
1768 case bsontype.Type(0), bsontype.EmbeddedDocument:
1769 default:
1770 return nil, fmt.Errorf("cannot decode %v into a D", vr.Type())
1771 }
1772
1773 dr, err := vr.ReadDocument()
1774 if err != nil {
1775 return nil, err
1776 }
1777
1778 return dvd.decodeElemsFromDocumentReader(dc, dr)
1779 }
1780
1781 func (DefaultValueDecoders) decodeElemsFromDocumentReader(dc DecodeContext, dr bsonrw.DocumentReader) ([]reflect.Value, error) {
1782 decoder, err := dc.LookupDecoder(tEmpty)
1783 if err != nil {
1784 return nil, err
1785 }
1786
1787 elems := make([]reflect.Value, 0)
1788 for {
1789 key, vr, err := dr.ReadElement()
1790 if errors.Is(err, bsonrw.ErrEOD) {
1791 break
1792 }
1793 if err != nil {
1794 return nil, err
1795 }
1796
1797 val := reflect.New(tEmpty).Elem()
1798 err = decoder.DecodeValue(dc, vr, val)
1799 if err != nil {
1800 return nil, newDecodeError(key, err)
1801 }
1802
1803 elems = append(elems, reflect.ValueOf(primitive.E{Key: key, Value: val.Interface()}))
1804 }
1805
1806 return elems, nil
1807 }
1808
View as plain text