-
Type: Spec Change
-
Resolution: Unresolved
-
Priority: Unknown
-
None
-
Affects Version/s: None
-
Component/s: None
-
None
There are multiple references to type asserting data in the bsoncodec package. For example:
m, ok := val.Interface().(ValueUnmarshaler) if !ok { // NB: this error should be unreachable due to the above checks return ValueDecoderError{Name: "ValueUnmarshalerDecodeValue", Types: []reflect.Type{tValueUnmarshaler}, Received: val} }
and
m, ok := val.Interface().(Unmarshaler) if !ok { // NB: this error should be unreachable due to the above checks return ValueDecoderError{Name: "UnmarshalerDecodeValue", Types: []reflect.Type{tUnmarshaler}, Received: val} }
It would be helpful for readability and reuse to create a single function that handles all of this logic, something like the following:
switch v := val.Interface().(type) { case ValueUnmarshaler: // Handle ValueUnmarshaler case return ValueDecoderError{Name: "ValueUnmarshalerDecodeValue", Types: []reflect.Type{tValueUnmarshaler}, Received: val} case Unmarshaler: // Handle Unmarshaler case return ValueDecoderError{Name: "UnmarshalerDecodeValue", Types: []reflect.Type{tUnmarshaler}, Received: val} default: // Handle the case when neither interface is implemented return vw.WriteNull() }
- related to
-
GODRIVER-2887 bson: remove use of reflect.Value.MethodByName
- Closed