Skip to content

Commit b3fbcef

Browse files
GODRIVER-3455 Add RF suffix to encoders
1 parent 760fe05 commit b3fbcef

File tree

1 file changed

+70
-139
lines changed

1 file changed

+70
-139
lines changed

bson/default_value_encoders.go

Lines changed: 70 additions & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
299268
func 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.
574505
func regexEncodeValue(_ EncodeContext, vw ValueWriter, val reflect.Value) error {
575506
if !val.IsValid() || val.Type() != tRegex {

0 commit comments

Comments
 (0)