@@ -65,17 +65,17 @@ func registerDefaultEncoders(reg *Registry) {
6565 reg .registerReflectFreeTypeEncoder (tTime , reflectFreeValueEncoderFunc (timeEncodeValueRF ))
6666 reg .registerReflectFreeTypeEncoder (tEmpty , reflectFreeValueEncoderFunc (emptyInterfaceValueRF ))
6767 reg .registerReflectFreeTypeEncoder (tCoreArray , reflectFreeValueEncoderFunc (coreArrayEncodeValueRF ))
68- reg .registerReflectFreeTypeEncoder (tNull , reflectFreeValueEncoderFunc (nullEncodeValueX ))
69- reg .registerReflectFreeTypeEncoder (tOID , reflectFreeValueEncoderFunc (objectIDEncodeValueX ))
70- reg .registerReflectFreeTypeEncoder (tDecimal , reflectFreeValueEncoderFunc (decimal128EncodeValueX ))
71- reg .registerReflectFreeTypeEncoder (tJSONNumber , reflectFreeValueEncoderFunc (jsonNumberEncodeValueX ))
72- reg .registerReflectFreeTypeEncoder (tURL , reflectFreeValueEncoderFunc (urlEncodeValueX ))
73- reg .registerReflectFreeTypeEncoder (tJavaScript , reflectFreeValueEncoderFunc (javaScriptEncodeValueX ))
74- reg .registerReflectFreeTypeEncoder (tSymbol , reflectFreeValueEncoderFunc (symbolEncodeValueX ))
75- reg .registerReflectFreeTypeEncoder (tBinary , reflectFreeValueEncoderFunc (binaryEncodeValueX ))
76- reg .registerReflectFreeTypeEncoder (tVector , reflectFreeValueEncoderFunc (vectorEncodeValueX ))
77- reg .registerReflectFreeTypeEncoder (tUndefined , reflectFreeValueEncoderFunc (undefinedEncodeValueX ))
78- reg .registerReflectFreeTypeEncoder (tDateTime , reflectFreeValueEncoderFunc (dateTimeEncodeValueX ))
68+ reg .registerReflectFreeTypeEncoder (tNull , reflectFreeValueEncoderFunc (nullEncodeValueRF ))
69+ reg .registerReflectFreeTypeEncoder (tOID , reflectFreeValueEncoderFunc (objectIDEncodeValueRF ))
70+ reg .registerReflectFreeTypeEncoder (tDecimal , reflectFreeValueEncoderFunc (decimal128EncodeValueRF ))
71+ reg .registerReflectFreeTypeEncoder (tJSONNumber , reflectFreeValueEncoderFunc (jsonNumberEncodeValueRF ))
72+ reg .registerReflectFreeTypeEncoder (tURL , reflectFreeValueEncoderFunc (urlEncodeValueRF ))
73+ reg .registerReflectFreeTypeEncoder (tJavaScript , reflectFreeValueEncoderFunc (javaScriptEncodeValueRF ))
74+ reg .registerReflectFreeTypeEncoder (tSymbol , reflectFreeValueEncoderFunc (symbolEncodeValueRF ))
75+ reg .registerReflectFreeTypeEncoder (tBinary , reflectFreeValueEncoderFunc (binaryEncodeValueRF ))
76+ reg .registerReflectFreeTypeEncoder (tVector , reflectFreeValueEncoderFunc (vectorEncodeValueRF ))
77+ reg .registerReflectFreeTypeEncoder (tUndefined , reflectFreeValueEncoderFunc (undefinedEncodeValueRF ))
78+ reg .registerReflectFreeTypeEncoder (tDateTime , reflectFreeValueEncoderFunc (dateTimeEncodeValueRF ))
7979 reg .registerReflectFreeTypeEncoder (tRegex , reflectFreeValueEncoderFunc (regexEncodeValueX ))
8080 reg .registerReflectFreeTypeEncoder (tDBPointer , reflectFreeValueEncoderFunc (dbPointerEncodeValueX ))
8181 reg .registerReflectFreeTypeEncoder (tTimestamp , reflectFreeValueEncoderFunc (timestampEncodeValueX ))
@@ -176,35 +176,25 @@ func intEncodeValue(ec EncodeContext, vw ValueWriter, val reflect.Value) error {
176176 }
177177}
178178
179- // floatEncodeValue is the ValueEncoderFunc for float types.
180- func floatEncodeValue (_ EncodeContext , vw ValueWriter , val reflect.Value ) error {
181- switch val .Kind () {
182- case reflect .Float32 , reflect .Float64 :
183- return vw .WriteDouble (val .Float ())
179+ func floatEncodeValueRF (_ EncodeContext , vw ValueWriter , val any ) error {
180+ if f32 , ok := val .(float32 ); ok {
181+ return vw .WriteDouble (float64 (f32 ))
184182 }
185183
186- return ValueEncoderError {Name : "FloatEncodeValue" , Kinds : []reflect.Kind {reflect .Float32 , reflect .Float64 }, Received : val }
187- }
188-
189- func floatEncodeValueX (_ EncodeContext , vw ValueWriter , val any ) error {
190- switch val := val .(type ) {
191- case float32 , float64 :
192- return vw .WriteDouble (val .(float64 ))
184+ if f64 , ok := val .(float64 ); ok {
185+ return vw .WriteDouble (f64 )
193186 }
194187
195188 return ValueEncoderError {Name : "FloatEncodeValue" , Kinds : []reflect.Kind {reflect .Float32 , reflect .Float64 }, Received : reflect .ValueOf (val )}
196189}
197190
198- // objectIDEncodeValue is the ValueEncoderFunc for ObjectID.
199- func objectIDEncodeValue (_ EncodeContext , vw ValueWriter , val reflect.Value ) error {
200- if ! val .IsValid () || val .Type () != tOID {
201- return ValueEncoderError {Name : "ObjectIDEncodeValue" , Types : []reflect.Type {tOID }, Received : val }
202- }
203- return vw .WriteObjectID (val .Interface ().(ObjectID ))
191+ // floatEncodeValue is the ValueEncoderFunc for float types.
192+ func floatEncodeValue (ec EncodeContext , vw ValueWriter , val reflect.Value ) error {
193+ return floatEncodeValueRF (ec , vw , val .Interface ())
204194}
205195
206196// objectIDEncodeValue is the ValueEncoderFunc for ObjectID.
207- func objectIDEncodeValueX (_ EncodeContext , vw ValueWriter , val any ) error {
197+ func objectIDEncodeValueRF (_ EncodeContext , vw ValueWriter , val any ) error {
208198 objID , ok := val .(ObjectID )
209199 if ! ok {
210200 return ValueEncoderError {
@@ -217,48 +207,26 @@ func objectIDEncodeValueX(_ EncodeContext, vw ValueWriter, val any) error {
217207 return vw .WriteObjectID (objID )
218208}
219209
220- // decimal128EncodeValue is the ValueEncoderFunc for Decimal128.
221- func decimal128EncodeValue (_ EncodeContext , vw ValueWriter , val reflect.Value ) error {
222- if ! val .IsValid () || val .Type () != tDecimal {
223- return ValueEncoderError {Name : "Decimal128EncodeValue" , Types : []reflect.Type {tDecimal }, Received : val }
224- }
225- return vw .WriteDecimal128 (val .Interface ().(Decimal128 ))
210+ // objectIDEncodeValue is the ValueEncoderFunc for ObjectID.
211+ func objectIDEncodeValue (ec EncodeContext , vw ValueWriter , val reflect.Value ) error {
212+ return objectIDEncodeValueRF (ec , vw , val .Interface ())
226213}
227214
228- func decimal128EncodeValueX (_ EncodeContext , vw ValueWriter , val any ) error {
215+ func decimal128EncodeValueRF (_ EncodeContext , vw ValueWriter , val any ) error {
229216 d128 , ok := val .(Decimal128 )
230217 if ! ok {
231- return ValueEncoderError {
232- Name : "Decimal128EncodeValue" ,
233- Types : []reflect.Type {tDecimal },
234- Received : reflect .ValueOf (val ),
235- }
218+ return ValueEncoderError {Name : "Decimal128EncodeValue" , Types : []reflect.Type {tDecimal }, Received : reflect .ValueOf (val )}
236219 }
237220
238221 return vw .WriteDecimal128 (d128 )
239222}
240223
241- // jsonNumberEncodeValue is the ValueEncoderFunc for json.Number.
242- func jsonNumberEncodeValue (ec EncodeContext , vw ValueWriter , val reflect.Value ) error {
243- if ! val .IsValid () || val .Type () != tJSONNumber {
244- return ValueEncoderError {Name : "JSONNumberEncodeValue" , Types : []reflect.Type {tJSONNumber }, Received : val }
245- }
246- jsnum := val .Interface ().(json.Number )
247-
248- // Attempt int first, then float64
249- if i64 , err := jsnum .Int64 (); err == nil {
250- return intEncodeValue (ec , vw , reflect .ValueOf (i64 ))
251- }
252-
253- f64 , err := jsnum .Float64 ()
254- if err != nil {
255- return err
256- }
257-
258- return floatEncodeValue (ec , vw , reflect .ValueOf (f64 ))
224+ // decimal128EncodeValue is the ValueEncoderFunc for Decimal128.
225+ func decimal128EncodeValue (ec EncodeContext , vw ValueWriter , val reflect.Value ) error {
226+ return decimal128EncodeValueRF (ec , vw , val .Interface ())
259227}
260228
261- func jsonNumberEncodeValueX (ec EncodeContext , vw ValueWriter , val any ) error {
229+ func jsonNumberEncodeValueRF (ec EncodeContext , vw ValueWriter , val any ) error {
262230 jsnum , ok := val .(json.Number )
263231 if ! ok {
264232 return ValueEncoderError {Name : "JSONNumberEncodeValue" , Types : []reflect.Type {tJSONNumber }, Received : reflect .ValueOf (val )}
@@ -274,19 +242,15 @@ func jsonNumberEncodeValueX(ec EncodeContext, vw ValueWriter, val any) error {
274242 return err
275243 }
276244
277- return floatEncodeValueX (ec , vw , f64 )
245+ return floatEncodeValueRF (ec , vw , f64 )
278246}
279247
280- // urlEncodeValue is the ValueEncoderFunc for url.URL.
281- func urlEncodeValue (_ EncodeContext , vw ValueWriter , val reflect.Value ) error {
282- if ! val .IsValid () || val .Type () != tURL {
283- return ValueEncoderError {Name : "URLEncodeValue" , Types : []reflect.Type {tURL }, Received : val }
284- }
285- u := val .Interface ().(url.URL )
286- return vw .WriteString (u .String ())
248+ // jsonNumberEncodeValue is the ValueEncoderFunc for json.Number.
249+ func jsonNumberEncodeValue (ec EncodeContext , vw ValueWriter , val reflect.Value ) error {
250+ return jsonNumberEncodeValueRF (ec , vw , val .Interface ())
287251}
288252
289- func urlEncodeValueX (_ EncodeContext , vw ValueWriter , val any ) error {
253+ func urlEncodeValueRF (_ EncodeContext , vw ValueWriter , val any ) error {
290254 u , ok := val .(url.URL )
291255 if ! ok {
292256 return ValueEncoderError {Name : "URLEncodeValue" , Types : []reflect.Type {tURL }, Received : reflect .ValueOf (val )}
@@ -295,6 +259,11 @@ func urlEncodeValueX(_ EncodeContext, vw ValueWriter, val any) error {
295259 return vw .WriteString (u .String ())
296260}
297261
262+ // urlEncodeValue is the ValueEncoderFunc for url.URL.
263+ func urlEncodeValue (ec EncodeContext , vw ValueWriter , val reflect.Value ) error {
264+ return urlEncodeValueRF (ec , vw , val .Interface ())
265+ }
266+
298267// arrayEncodeValue is the ValueEncoderFunc for array types.
299268func arrayEncodeValue (ec EncodeContext , vw ValueWriter , val reflect.Value ) error {
300269 if ! val .IsValid () || val .Kind () != reflect .Array {
@@ -435,16 +404,7 @@ func marshalerEncodeValue(_ EncodeContext, vw ValueWriter, val reflect.Value) er
435404 return copyValueFromBytes (vw , TypeEmbeddedDocument , data )
436405}
437406
438- // javaScriptEncodeValue is the ValueEncoderFunc for the JavaScript type.
439- func javaScriptEncodeValue (_ EncodeContext , vw ValueWriter , val reflect.Value ) error {
440- if ! val .IsValid () || val .Type () != tJavaScript {
441- return ValueEncoderError {Name : "JavaScriptEncodeValue" , Types : []reflect.Type {tJavaScript }, Received : val }
442- }
443-
444- return vw .WriteJavascript (val .String ())
445- }
446-
447- func javaScriptEncodeValueX (_ EncodeContext , vw ValueWriter , val any ) error {
407+ func javaScriptEncodeValueRF (_ EncodeContext , vw ValueWriter , val any ) error {
448408 jsString , ok := val .(JavaScript )
449409 if ! ok {
450410 return ValueEncoderError {Name : "JavaScriptEncodeValue" , Types : []reflect.Type {tJavaScript }, Received : reflect .ValueOf (val )}
@@ -453,16 +413,12 @@ func javaScriptEncodeValueX(_ EncodeContext, vw ValueWriter, val any) error {
453413 return vw .WriteJavascript (string (jsString ))
454414}
455415
456- // symbolEncodeValue is the ValueEncoderFunc for the Symbol type.
457- func symbolEncodeValue (_ EncodeContext , vw ValueWriter , val reflect.Value ) error {
458- if ! val .IsValid () || val .Type () != tSymbol {
459- return ValueEncoderError {Name : "SymbolEncodeValue" , Types : []reflect.Type {tSymbol }, Received : val }
460- }
461-
462- return vw .WriteSymbol (val .String ())
416+ // javaScriptEncodeValue is the ValueEncoderFunc for the JavaScript type.
417+ func javaScriptEncodeValue (_ EncodeContext , vw ValueWriter , val reflect.Value ) error {
418+ return javaScriptEncodeValueRF (EncodeContext {}, vw , val .Interface ())
463419}
464420
465- func symbolEncodeValueX (_ EncodeContext , vw ValueWriter , val any ) error {
421+ func symbolEncodeValueRF (_ EncodeContext , vw ValueWriter , val any ) error {
466422 symbol , ok := val .(Symbol )
467423 if ! ok {
468424 return ValueEncoderError {Name : "SymbolEncodeValue" , Types : []reflect.Type {tSymbol }, Received : reflect .ValueOf (val )}
@@ -471,17 +427,12 @@ func symbolEncodeValueX(_ EncodeContext, vw ValueWriter, val any) error {
471427 return vw .WriteSymbol (string (symbol ))
472428}
473429
474- // binaryEncodeValue is the ValueEncoderFunc for Binary.
475- func binaryEncodeValue (_ EncodeContext , vw ValueWriter , val reflect.Value ) error {
476- if ! val .IsValid () || val .Type () != tBinary {
477- return ValueEncoderError {Name : "BinaryEncodeValue" , Types : []reflect.Type {tBinary }, Received : val }
478- }
479- b := val .Interface ().(Binary )
480-
481- return vw .WriteBinaryWithSubtype (b .Data , b .Subtype )
430+ // symbolEncodeValue is the ValueEncoderFunc for the Symbol type.
431+ func symbolEncodeValue (_ EncodeContext , vw ValueWriter , val reflect.Value ) error {
432+ return symbolEncodeValueRF (EncodeContext {}, vw , val .Interface ())
482433}
483434
484- func binaryEncodeValueX (_ EncodeContext , vw ValueWriter , val any ) error {
435+ func binaryEncodeValueRF (_ EncodeContext , vw ValueWriter , val any ) error {
485436 b , ok := val .(Binary )
486437 if ! ok {
487438 return ValueEncoderError {Name : "BinaryEncodeValue" , Types : []reflect.Type {tBinary }, Received : reflect .ValueOf (val )}
@@ -490,21 +441,12 @@ func binaryEncodeValueX(_ EncodeContext, vw ValueWriter, val any) error {
490441 return vw .WriteBinaryWithSubtype (b .Data , b .Subtype )
491442}
492443
493- // vectorEncodeValue is the ValueEncoderFunc for Vector.
494- func vectorEncodeValue (_ EncodeContext , vw ValueWriter , val reflect.Value ) error {
495- t := val .Type ()
496- if ! val .IsValid () || t != tVector {
497- return ValueEncoderError {Name : "VectorEncodeValue" ,
498- Types : []reflect.Type {tVector },
499- Received : val ,
500- }
501- }
502- v := val .Interface ().(Vector )
503- b := v .Binary ()
504- return vw .WriteBinaryWithSubtype (b .Data , b .Subtype )
444+ // binaryEncodeValue is the ValueEncoderFunc for Binary.
445+ func binaryEncodeValue (_ EncodeContext , vw ValueWriter , val reflect.Value ) error {
446+ return binaryEncodeValueRF (EncodeContext {}, vw , val .Interface ())
505447}
506448
507- func vectorEncodeValueX (_ EncodeContext , vw ValueWriter , val any ) error {
449+ func vectorEncodeValueRF (_ EncodeContext , vw ValueWriter , val any ) error {
508450 v , ok := val .(Vector )
509451 if ! ok {
510452 return ValueEncoderError {Name : "VectorEncodeValue" , Types : []reflect.Type {tVector }, Received : reflect .ValueOf (val )}
@@ -514,33 +456,25 @@ func vectorEncodeValueX(_ EncodeContext, vw ValueWriter, val any) error {
514456 return vw .WriteBinaryWithSubtype (b .Data , b .Subtype )
515457}
516458
517- // undefinedEncodeValue is the ValueEncoderFunc for Undefined.
518- func undefinedEncodeValue (_ EncodeContext , vw ValueWriter , val reflect.Value ) error {
519- if ! val .IsValid () || val .Type () != tUndefined {
520- return ValueEncoderError {Name : "UndefinedEncodeValue" , Types : []reflect.Type {tUndefined }, Received : val }
521- }
522-
523- return vw .WriteUndefined ()
459+ // vectorEncodeValue is the ValueEncoderFunc for Vector.
460+ func vectorEncodeValue (_ EncodeContext , vw ValueWriter , val reflect.Value ) error {
461+ return vectorEncodeValueRF (EncodeContext {}, vw , val .Interface ())
524462}
525463
526- func undefinedEncodeValueX (_ EncodeContext , vw ValueWriter , val any ) error {
464+ func undefinedEncodeValueRF (_ EncodeContext , vw ValueWriter , val any ) error {
527465 if _ , ok := val .(Undefined ); ! ok {
528466 return ValueEncoderError {Name : "UndefinedEncodeValue" , Types : []reflect.Type {tUndefined }, Received : reflect .ValueOf (val )}
529467 }
530468
531469 return vw .WriteUndefined ()
532470}
533471
534- // dateTimeEncodeValue is the ValueEncoderFunc for DateTime.
535- func dateTimeEncodeValue (_ EncodeContext , vw ValueWriter , val reflect.Value ) error {
536- if ! val .IsValid () || val .Type () != tDateTime {
537- return ValueEncoderError {Name : "DateTimeEncodeValue" , Types : []reflect.Type {tDateTime }, Received : val }
538- }
539-
540- return vw .WriteDateTime (val .Int ())
472+ // undefinedEncodeValue is the ValueEncoderFunc for Undefined.
473+ func undefinedEncodeValue (_ EncodeContext , vw ValueWriter , val reflect.Value ) error {
474+ return undefinedEncodeValueRF (EncodeContext {}, vw , val .Interface ())
541475}
542476
543- func dateTimeEncodeValueX (_ EncodeContext , vw ValueWriter , val any ) error {
477+ func dateTimeEncodeValueRF (_ EncodeContext , vw ValueWriter , val any ) error {
544478 dateTime , ok := val .(DateTime )
545479 if ! ok {
546480 return ValueEncoderError {Name : "DateTimeEncodeValue" , Types : []reflect.Type {tDateTime }, Received : reflect .ValueOf (val )}
@@ -549,27 +483,24 @@ func dateTimeEncodeValueX(_ EncodeContext, vw ValueWriter, val any) error {
549483 return vw .WriteDateTime (int64 (dateTime ))
550484}
551485
552- // nullEncodeValue is the ValueEncoderFunc for Null.
553- func nullEncodeValue (_ EncodeContext , vw ValueWriter , val reflect.Value ) error {
554- if ! val .IsValid () || val .Type () != tNull {
555- return ValueEncoderError {Name : "NullEncodeValue" , Types : []reflect.Type {tNull }, Received : val }
556- }
557-
558- return vw .WriteNull ()
486+ // dateTimeEncodeValue is the ValueEncoderFunc for DateTime.
487+ func dateTimeEncodeValue (_ EncodeContext , vw ValueWriter , val reflect.Value ) error {
488+ return dateTimeEncodeValueRF (EncodeContext {}, vw , val .Interface ())
559489}
560490
561- func nullEncodeValueX (_ EncodeContext , vw ValueWriter , val any ) error {
491+ func nullEncodeValueRF (_ EncodeContext , vw ValueWriter , val any ) error {
562492 if _ , ok := val .(Null ); ! ok {
563- return ValueEncoderError {
564- Name : "NullEncodeValue" ,
565- Types : []reflect.Type {tNull },
566- Received : reflect .ValueOf (val ),
567- }
493+ return ValueEncoderError {Name : "NullEncodeValue" , Types : []reflect.Type {tNull }, Received : reflect .ValueOf (val )}
568494 }
569495
570496 return vw .WriteNull ()
571497}
572498
499+ // nullEncodeValue is the ValueEncoderFunc for Null.
500+ func nullEncodeValue (_ EncodeContext , vw ValueWriter , val reflect.Value ) error {
501+ return nullEncodeValueRF (EncodeContext {}, vw , val .Interface ())
502+ }
503+
573504// regexEncodeValue is the ValueEncoderFunc for Regex.
574505func regexEncodeValue (_ EncodeContext , vw ValueWriter , val reflect.Value ) error {
575506 if ! val .IsValid () || val .Type () != tRegex {
0 commit comments