77package bson
88
99import (
10- "encoding/json"
1110 "errors"
1211 "fmt"
13- "net/url"
1412 "reflect"
1513 "sync"
16- "time"
17-
18- "go.mongodb.org/mongo-driver/v2/x/bsonx/bsoncore"
1914)
2015
2116// defaultRegistry is the default Registry. It contains the default codecs and the
@@ -246,130 +241,6 @@ func (r *Registry) RegisterTypeMapEntry(bt Type, rt reflect.Type) {
246241 r .typeMap .Store (bt , rt )
247242}
248243
249- func getReflectTypeFromAny (val any ) (reflect.Type , error ) {
250- switch v := val .(type ) {
251- case bool :
252- return tBool , nil
253- case float64 :
254- return tFloat64 , nil
255- case int32 :
256- return tInt32 , nil
257- case int64 :
258- return tInt64 , nil
259- case string :
260- return tString , nil
261- case time.Time :
262- return tTime , nil
263- case interface {}:
264- return tEmpty , nil
265- case []byte :
266- return tByteSlice , nil
267- case byte :
268- return tByte , nil
269- case url.URL :
270- return tURL , nil
271- case json.Number :
272- return tJSONNumber , nil
273- case ValueMarshaler :
274- return tValueMarshaler , nil
275- case ValueUnmarshaler :
276- return tValueUnmarshaler , nil
277- case Marshaler :
278- return tMarshaler , nil
279- case Unmarshaler :
280- return tUnmarshaler , nil
281- case Zeroer :
282- return tZeroer , nil
283- case Binary :
284- return tBinary , nil
285- case Undefined :
286- return tUndefined , nil
287- case ObjectID :
288- return tOID , nil
289- case DateTime :
290- return tDateTime , nil
291- case Null :
292- return tNull , nil
293- case Regex :
294- return tRegex , nil
295- case CodeWithScope :
296- return tCodeWithScope , nil
297- case DBPointer :
298- return tDBPointer , nil
299- case JavaScript :
300- return tJavaScript , nil
301- case Symbol :
302- return tSymbol , nil
303- case Timestamp :
304- return tTimestamp , nil
305- case Decimal128 :
306- return tDecimal , nil
307- case Vector :
308- return tVector , nil
309- case MinKey :
310- return tMinKey , nil
311- case MaxKey :
312- return tMaxKey , nil
313- case D :
314- return tD , nil
315- case A :
316- return tA , nil
317- case E :
318- return tE , nil
319- case bsoncore.Document :
320- return tCoreDocument , nil
321- case bsoncore.Array :
322- return tCoreArray , nil
323- default :
324- return nil , fmt .Errorf ("no default encoder for type %T" , v )
325- }
326- }
327-
328- //func lookupReflectFreeEncoder(r *Registry, typ reflect.Type) (reflectFreeValueEncoder, error) {
329- //}
330-
331- func lookupEncoderReflectFree (r * Registry , typ reflect.Type , val any ) (reflectFreeValueEncoder , error ) {
332- if typ == nil {
333- var err error
334-
335- typ , err = getReflectTypeFromAny (val )
336- if err != nil {
337- return nil , err
338- }
339- }
340-
341- rfeEnc , found := r .reflectFreeTypeEncoders .Load (typ )
342- if ! found {
343- return nil , errNoEncoder {Type : typ }
344- }
345-
346- return rfeEnc , nil
347- }
348-
349- func lookupUserDefinedEncoder (r * Registry , val any ) (ValueEncoder , reflect.Type , bool , error ) {
350- typ , err := getReflectTypeFromAny (val )
351- if err != nil {
352- return nil , nil , false , err
353- }
354-
355- enc , found := r .lookupTypeEncoder (typ )
356- if found {
357- if enc == nil {
358- return nil , typ , false , errNoEncoder {Type : typ }
359- }
360-
361- // We do not use ValueEncoder in the default case, preferring a reflect-free
362- // solution.
363- if _ , ok := enc .(defaultValueEncoderFunc ); ok {
364- return nil , typ , false , nil
365- }
366-
367- return enc , typ , true , nil
368- }
369-
370- return nil , typ , false , nil
371- }
372-
373244// LookupEncoder returns the first matching encoder in the Registry. It uses the following lookup
374245// order:
375246//
@@ -392,30 +263,27 @@ func (r *Registry) LookupEncoder(valueType reflect.Type) (ValueEncoder, error) {
392263 return nil , errNoEncoder {Type : valueType }
393264 }
394265
395- // First attempt to lookup a reflect-free default encoder.
396- // TODO: This will be moved in favor of the lookup* solution.
397- rfeEnc , found := r .reflectFreeTypeEncoders .Load (valueType )
398- if found {
399- if rfeEnc != nil {
400- wrapper := func (ec EncodeContext , vw ValueWriter , val reflect.Value ) error {
401- return rfeEnc .EncodeValue (ec , vw , val .Interface ())
402- }
266+ // First attempt to get a user-defined type encoder.
267+ if enc , found := r .lookupTypeEncoder (valueType ); found {
268+ if enc == nil {
269+ return nil , errNoEncoder {Type : valueType }
270+ }
403271
404- return ValueEncoderFunc (wrapper ), nil
272+ if _ , ok := enc .(defaultValueEncoderFunc ); ! ok {
273+ return enc , nil
405274 }
406275 }
407276
408- // Then lookup a user-defined encoder.
409- enc , found := r .lookupTypeEncoder (valueType )
410- if found {
411- if enc == nil {
412- return nil , errNoEncoder {Type : valueType }
277+ // Next try to get a reflection-free encoder.
278+ if rfeEnc , found := r .reflectFreeTypeEncoders .Load (valueType ); found && rfeEnc != nil {
279+ wrapper := func (ec EncodeContext , vw ValueWriter , val reflect.Value ) error {
280+ return rfeEnc .EncodeValue (ec , vw , val .Interface ())
413281 }
414- return enc , nil
282+
283+ return ValueEncoderFunc (wrapper ), nil
415284 }
416285
417- enc , found = r .lookupInterfaceEncoder (valueType , true )
418- if found {
286+ if enc , found := r .lookupInterfaceEncoder (valueType , true ); found {
419287 return r .typeEncoders .LoadOrStore (valueType , enc ), nil
420288 }
421289
0 commit comments