@@ -564,12 +564,14 @@ func (dve DefaultValueEncoders) ValueMarshalerEncodeValue(_ EncodeContext, vw bs
564
564
return ValueEncoderError {Name : "ValueMarshalerEncodeValue" , Types : []reflect.Type {tValueMarshaler }, Received : val }
565
565
}
566
566
567
- fn := val .Convert (tValueMarshaler ).MethodByName ("MarshalBSONValue" )
568
- returns := fn .Call (nil )
569
- if ! returns [2 ].IsNil () {
570
- return returns [2 ].Interface ().(error )
567
+ m , ok := val .Interface ().(ValueMarshaler )
568
+ if ! ok {
569
+ return vw .WriteNull ()
570
+ }
571
+ t , data , err := m .MarshalBSONValue ()
572
+ if err != nil {
573
+ return err
571
574
}
572
- t , data := returns [0 ].Interface ().(bsontype.Type ), returns [1 ].Interface ().([]byte )
573
575
return bsonrw.Copier {}.CopyValueFromBytes (vw , t , data )
574
576
}
575
577
@@ -593,12 +595,14 @@ func (dve DefaultValueEncoders) MarshalerEncodeValue(_ EncodeContext, vw bsonrw.
593
595
return ValueEncoderError {Name : "MarshalerEncodeValue" , Types : []reflect.Type {tMarshaler }, Received : val }
594
596
}
595
597
596
- fn := val .Convert (tMarshaler ).MethodByName ("MarshalBSON" )
597
- returns := fn .Call (nil )
598
- if ! returns [1 ].IsNil () {
599
- return returns [1 ].Interface ().(error )
598
+ m , ok := val .Interface ().(Marshaler )
599
+ if ! ok {
600
+ return vw .WriteNull ()
601
+ }
602
+ data , err := m .MarshalBSON ()
603
+ if err != nil {
604
+ return err
600
605
}
601
- data := returns [0 ].Interface ().([]byte )
602
606
return bsonrw.Copier {}.CopyValueFromBytes (vw , bsontype .EmbeddedDocument , data )
603
607
}
604
608
@@ -622,23 +626,31 @@ func (dve DefaultValueEncoders) ProxyEncodeValue(ec EncodeContext, vw bsonrw.Val
622
626
return ValueEncoderError {Name : "ProxyEncodeValue" , Types : []reflect.Type {tProxy }, Received : val }
623
627
}
624
628
625
- fn := val .Convert (tProxy ).MethodByName ("ProxyBSON" )
626
- returns := fn .Call (nil )
627
- if ! returns [1 ].IsNil () {
628
- return returns [1 ].Interface ().(error )
629
+ m , ok := val .Interface ().(Proxy )
630
+ if ! ok {
631
+ return vw .WriteNull ()
632
+ }
633
+ v , err := m .ProxyBSON ()
634
+ if err != nil {
635
+ return err
636
+ }
637
+ if v == nil {
638
+ encoder , err := ec .LookupEncoder (nil )
639
+ if err != nil {
640
+ return err
641
+ }
642
+ return encoder .EncodeValue (ec , vw , reflect .ValueOf (nil ))
629
643
}
630
- data := returns [0 ]
631
- var encoder ValueEncoder
632
- var err error
633
- if data .Elem ().IsValid () {
634
- encoder , err = ec .LookupEncoder (data .Elem ().Type ())
635
- } else {
636
- encoder , err = ec .LookupEncoder (nil )
644
+ vv := reflect .ValueOf (v )
645
+ switch vv .Kind () {
646
+ case reflect .Ptr , reflect .Interface :
647
+ vv = vv .Elem ()
637
648
}
649
+ encoder , err := ec .LookupEncoder (vv .Type ())
638
650
if err != nil {
639
651
return err
640
652
}
641
- return encoder .EncodeValue (ec , vw , data . Elem () )
653
+ return encoder .EncodeValue (ec , vw , vv )
642
654
}
643
655
644
656
// JavaScriptEncodeValue is the ValueEncoderFunc for the primitive.JavaScript type.
0 commit comments