@@ -48,6 +48,7 @@ func (dvd DefaultValueDecoders) RegisterDefaultDecoders(rb *RegistryBuilder) {
48
48
RegisterDecoder (reflect .PtrTo (tJSONNumber ), ValueDecoderFunc (dvd .JSONNumberDecodeValue )).
49
49
RegisterDecoder (reflect .PtrTo (tURL ), ValueDecoderFunc (dvd .URLDecodeValue )).
50
50
RegisterDecoder (tValueUnmarshaler , ValueDecoderFunc (dvd .ValueUnmarshalerDecodeValue )).
51
+ RegisterDecoder (tUnmarshaler , ValueDecoderFunc (dvd .UnmarshalerDecodeValue )).
51
52
RegisterDefaultDecoder (reflect .Bool , ValueDecoderFunc (dvd .BooleanDecodeValue )).
52
53
RegisterDefaultDecoder (reflect .Int , ValueDecoderFunc (dvd .IntDecodeValue )).
53
54
RegisterDefaultDecoder (reflect .Int8 , ValueDecoderFunc (dvd .IntDecodeValue )).
@@ -735,6 +736,32 @@ func (dvd DefaultValueDecoders) ValueUnmarshalerDecodeValue(dc DecodeContext, vr
735
736
return valueUnmarshaler .UnmarshalBSONValue (t , src )
736
737
}
737
738
739
+ // UnmarshalerDecodeValue is the ValueDecoderFunc for Unmarshaler implementations.
740
+ func (dvd DefaultValueDecoders ) UnmarshalerDecodeValue (dc DecodeContext , vr bsonrw.ValueReader , i interface {}) error {
741
+ val := reflect .ValueOf (i )
742
+ var unmarshaler Unmarshaler
743
+ if val .Kind () == reflect .Ptr && val .IsNil () {
744
+ return fmt .Errorf ("UnmarshalerDecodeValue can only unmarshal into non-nil Unmarshaler values, got %T" , i )
745
+ }
746
+ if val .Type ().Implements (tUnmarshaler ) {
747
+ unmarshaler = val .Interface ().(Unmarshaler )
748
+ } else if val .Type ().Kind () == reflect .Ptr && val .Elem ().Type ().Implements (tUnmarshaler ) {
749
+ if val .Elem ().Kind () == reflect .Ptr && val .Elem ().IsNil () {
750
+ val .Elem ().Set (reflect .New (val .Type ().Elem ().Elem ()))
751
+ }
752
+ unmarshaler = val .Elem ().Interface ().(Unmarshaler )
753
+ } else {
754
+ return fmt .Errorf ("UnmarshalerDecodeValue can only handle types or pointers to types that are a Unmarshaler, got %T" , i )
755
+ }
756
+
757
+ _ , src , err := bsonrw.Copier {}.CopyValueToBytes (vr )
758
+ if err != nil {
759
+ return err
760
+ }
761
+
762
+ return unmarshaler .UnmarshalBSON (src )
763
+ }
764
+
738
765
// EmptyInterfaceDecodeValue is the ValueDecoderFunc for interface{}.
739
766
func (dvd DefaultValueDecoders ) EmptyInterfaceDecodeValue (dc DecodeContext , vr bsonrw.ValueReader , i interface {}) error {
740
767
target , ok := i .(* interface {})
0 commit comments