@@ -70,8 +70,13 @@ type DocumentUnmarshaler interface {
70
70
UnmarshalBSONDocument (* Document ) error
71
71
}
72
72
73
- // Decoder facilitates decoding a value from an io.Reader yielding a BSON document as bytes.
74
- type Decoder struct {
73
+ // Decoder describes a BSON representation that can decodes itself into a value.
74
+ type Decoder interface {
75
+ Decode (interface {}) error
76
+ }
77
+
78
+ // decoder facilitates decoding a value from an io.Reader yielding a BSON document as bytes.
79
+ type decoder struct {
75
80
pReader * peekLengthReader
76
81
bsonReader Reader
77
82
}
@@ -118,14 +123,9 @@ func (r *peekLengthReader) Read(b []byte) (int, error) {
118
123
return int (bytesToRead ), nil
119
124
}
120
125
121
- // NewDecoder constructs a new Decoder from the given io.Reader.
122
- func NewDecoder (r io.Reader ) * Decoder {
123
- return & Decoder {pReader : newPeekLengthReader (r )}
124
- }
125
-
126
- // Decode decodes the BSON document from the underlying io.Reader into the given value.
126
+ // NewDecoder constructs a new default Decoder implementation from the given io.Reader.
127
127
//
128
- // The value can be any one of the following types:
128
+ // In this implementation, the value can be any one of the following types:
129
129
//
130
130
// - bson.Unmarshaler
131
131
// - io.Writer
@@ -152,7 +152,17 @@ func NewDecoder(r io.Reader) *Decoder {
152
152
// If the value would not fit the type and cannot be converted, it is silently skipped.
153
153
//
154
154
// Pointer values are initialized when necessary.
155
- func (d * Decoder ) Decode (v interface {}) error {
155
+
156
+ func NewDecoder (r io.Reader ) Decoder {
157
+ return newDecoder (r )
158
+ }
159
+
160
+ func newDecoder (r io.Reader ) * decoder {
161
+ return & decoder {pReader : newPeekLengthReader (r )}
162
+ }
163
+
164
+ // Decode decodes the BSON document from the underlying io.Reader into the given value.
165
+ func (d * decoder ) Decode (v interface {}) error {
156
166
switch t := v .(type ) {
157
167
case Unmarshaler :
158
168
err := d .decodeToReader ()
@@ -210,7 +220,7 @@ func (d *Decoder) Decode(v interface{}) error {
210
220
}
211
221
}
212
222
213
- func (d * Decoder ) decodeToReader () error {
223
+ func (d * decoder ) decodeToReader () error {
214
224
var err error
215
225
d .bsonReader , err = NewFromIOReader (d .pReader )
216
226
if err != nil {
@@ -222,7 +232,7 @@ func (d *Decoder) decodeToReader() error {
222
232
223
233
}
224
234
225
- func (d * Decoder ) reflectDecode (val reflect.Value ) (err error ) {
235
+ func (d * decoder ) reflectDecode (val reflect.Value ) (err error ) {
226
236
defer func () {
227
237
if e := recover (); e != nil {
228
238
err = fmt .Errorf ("%s" , e )
@@ -249,7 +259,7 @@ func (d *Decoder) reflectDecode(val reflect.Value) (err error) {
249
259
}
250
260
}
251
261
252
- func (d * Decoder ) createEmptyValue (r Reader , t reflect.Type ) (reflect.Value , error ) {
262
+ func (d * decoder ) createEmptyValue (r Reader , t reflect.Type ) (reflect.Value , error ) {
253
263
var val reflect.Value
254
264
255
265
if t == tReader {
@@ -293,7 +303,7 @@ func (d *Decoder) createEmptyValue(r Reader, t reflect.Type) (reflect.Value, err
293
303
return val , nil
294
304
}
295
305
296
- func (d * Decoder ) getReflectValue (v * Value , containerType reflect.Type , outer reflect.Type ) (reflect.Value , error ) {
306
+ func (d * decoder ) getReflectValue (v * Value , containerType reflect.Type , outer reflect.Type ) (reflect.Value , error ) {
297
307
var val reflect.Value
298
308
299
309
for containerType .Kind () == reflect .Ptr {
@@ -385,7 +395,7 @@ func (d *Decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
385
395
}
386
396
case 0x4 :
387
397
if containerType == tEmpty {
388
- d := NewDecoder (bytes .NewBuffer (v .ReaderArray ()))
398
+ d := newDecoder (bytes .NewBuffer (v .ReaderArray ()))
389
399
newVal , err := d .decodeBSONArrayToSlice (tEmptySlice )
390
400
if err != nil {
391
401
return val , err
@@ -397,7 +407,7 @@ func (d *Decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
397
407
}
398
408
399
409
if containerType .Kind () == reflect .Slice {
400
- d := NewDecoder (bytes .NewBuffer (v .ReaderArray ()))
410
+ d := newDecoder (bytes .NewBuffer (v .ReaderArray ()))
401
411
newVal , err := d .decodeBSONArrayToSlice (containerType )
402
412
if err != nil {
403
413
return val , err
@@ -409,7 +419,7 @@ func (d *Decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
409
419
}
410
420
411
421
if containerType .Kind () == reflect .Array {
412
- d := NewDecoder (bytes .NewBuffer (v .ReaderArray ()))
422
+ d := newDecoder (bytes .NewBuffer (v .ReaderArray ()))
413
423
newVal , err := d .decodeBSONArrayIntoArray (containerType )
414
424
if err != nil {
415
425
return val , err
@@ -662,7 +672,7 @@ func (d *Decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
662
672
return val , nil
663
673
}
664
674
665
- func (d * Decoder ) decodeIntoMap (mapVal reflect.Value ) error {
675
+ func (d * decoder ) decodeIntoMap (mapVal reflect.Value ) error {
666
676
err := d .decodeToReader ()
667
677
if err != nil {
668
678
return err
@@ -690,7 +700,7 @@ func (d *Decoder) decodeIntoMap(mapVal reflect.Value) error {
690
700
return itr .Err ()
691
701
}
692
702
693
- func (d * Decoder ) decodeBSONArrayToSlice (sliceType reflect.Type ) (reflect.Value , error ) {
703
+ func (d * decoder ) decodeBSONArrayToSlice (sliceType reflect.Type ) (reflect.Value , error ) {
694
704
var out reflect.Value
695
705
696
706
elems := make ([]reflect.Value , 0 )
@@ -737,7 +747,7 @@ func (d *Decoder) decodeBSONArrayToSlice(sliceType reflect.Type) (reflect.Value,
737
747
return out , nil
738
748
}
739
749
740
- func (d * Decoder ) decodeBSONArrayIntoArray (arrayType reflect.Type ) (reflect.Value , error ) {
750
+ func (d * decoder ) decodeBSONArrayIntoArray (arrayType reflect.Type ) (reflect.Value , error ) {
741
751
length := arrayType .Len ()
742
752
arrayVal := reflect .New (arrayType )
743
753
@@ -777,7 +787,7 @@ func (d *Decoder) decodeBSONArrayIntoArray(arrayType reflect.Type) (reflect.Valu
777
787
return arrayVal .Elem (), nil
778
788
}
779
789
780
- func (d * Decoder ) decodeIntoElementSlice (sliceVal reflect.Value ) error {
790
+ func (d * decoder ) decodeIntoElementSlice (sliceVal reflect.Value ) error {
781
791
if sliceVal .Type ().Elem () != tElement {
782
792
return nil
783
793
}
@@ -835,7 +845,7 @@ func matchesField(key string, field string, sType reflect.Type) bool {
835
845
return fieldKey == key
836
846
}
837
847
838
- func (d * Decoder ) decodeIntoStruct (structVal reflect.Value ) error {
848
+ func (d * decoder ) decodeIntoStruct (structVal reflect.Value ) error {
839
849
err := d .decodeToReader ()
840
850
if err != nil {
841
851
return err
0 commit comments