@@ -33,6 +33,27 @@ var sliceWriterPool = sync.Pool{
33
33
},
34
34
}
35
35
36
+ func encodeElement (ec EncodeContext , dw bsonrw.DocumentWriter , e primitive.E ) error {
37
+ vw , err := dw .WriteDocumentElement (e .Key )
38
+ if err != nil {
39
+ return err
40
+ }
41
+
42
+ if e .Value == nil {
43
+ return vw .WriteNull ()
44
+ }
45
+ encoder , err := ec .LookupEncoder (reflect .TypeOf (e .Value ))
46
+ if err != nil {
47
+ return err
48
+ }
49
+
50
+ err = encoder .EncodeValue (ec , vw , reflect .ValueOf (e .Value ))
51
+ if err != nil {
52
+ return err
53
+ }
54
+ return nil
55
+ }
56
+
36
57
// DefaultValueEncoders is a namespace type for the default ValueEncoders used
37
58
// when creating a registry.
38
59
type DefaultValueEncoders struct {}
@@ -304,17 +325,7 @@ func (dve DefaultValueEncoders) ArrayEncodeValue(ec EncodeContext, vw bsonrw.Val
304
325
305
326
for idx := 0 ; idx < val .Len (); idx ++ {
306
327
e := val .Index (idx ).Interface ().(primitive.E )
307
- vw , err := dw .WriteDocumentElement (e .Key )
308
- if err != nil {
309
- return err
310
- }
311
-
312
- encoder , err := ec .LookupEncoder (reflect .TypeOf (e .Value ))
313
- if err != nil {
314
- return err
315
- }
316
-
317
- err = encoder .EncodeValue (ec , vw , reflect .ValueOf (e .Value ))
328
+ err = encodeElement (ec , dw , e )
318
329
if err != nil {
319
330
return err
320
331
}
@@ -367,17 +378,7 @@ func (dve DefaultValueEncoders) SliceEncodeValue(ec EncodeContext, vw bsonrw.Val
367
378
}
368
379
369
380
for _ , e := range d {
370
- vw , err := dw .WriteDocumentElement (e .Key )
371
- if err != nil {
372
- return err
373
- }
374
-
375
- encoder , err := ec .LookupEncoder (reflect .TypeOf (e .Value ))
376
- if err != nil {
377
- return err
378
- }
379
-
380
- err = encoder .EncodeValue (ec , vw , reflect .ValueOf (e .Value ))
381
+ err = encodeElement (ec , dw , e )
381
382
if err != nil {
382
383
return err
383
384
}
0 commit comments