Skip to content

Commit 60a04ea

Browse files
tychoishSam Kleinman
authored andcommitted
GODRIVER-329: decoder interface
Change-Id: Ib2823cd16bc5c66dc9b67fe9b4f62c22a9e96eb0
1 parent 1a1b047 commit 60a04ea

File tree

1 file changed

+32
-22
lines changed

1 file changed

+32
-22
lines changed

bson/decode.go

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,13 @@ type DocumentUnmarshaler interface {
7070
UnmarshalBSONDocument(*Document) error
7171
}
7272

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 {
7580
pReader *peekLengthReader
7681
bsonReader Reader
7782
}
@@ -118,14 +123,9 @@ func (r *peekLengthReader) Read(b []byte) (int, error) {
118123
return int(bytesToRead), nil
119124
}
120125

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.
127127
//
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:
129129
//
130130
// - bson.Unmarshaler
131131
// - io.Writer
@@ -152,7 +152,17 @@ func NewDecoder(r io.Reader) *Decoder {
152152
// If the value would not fit the type and cannot be converted, it is silently skipped.
153153
//
154154
// 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 {
156166
switch t := v.(type) {
157167
case Unmarshaler:
158168
err := d.decodeToReader()
@@ -210,7 +220,7 @@ func (d *Decoder) Decode(v interface{}) error {
210220
}
211221
}
212222

213-
func (d *Decoder) decodeToReader() error {
223+
func (d *decoder) decodeToReader() error {
214224
var err error
215225
d.bsonReader, err = NewFromIOReader(d.pReader)
216226
if err != nil {
@@ -222,7 +232,7 @@ func (d *Decoder) decodeToReader() error {
222232

223233
}
224234

225-
func (d *Decoder) reflectDecode(val reflect.Value) (err error) {
235+
func (d *decoder) reflectDecode(val reflect.Value) (err error) {
226236
defer func() {
227237
if e := recover(); e != nil {
228238
err = fmt.Errorf("%s", e)
@@ -249,7 +259,7 @@ func (d *Decoder) reflectDecode(val reflect.Value) (err error) {
249259
}
250260
}
251261

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) {
253263
var val reflect.Value
254264

255265
if t == tReader {
@@ -293,7 +303,7 @@ func (d *Decoder) createEmptyValue(r Reader, t reflect.Type) (reflect.Value, err
293303
return val, nil
294304
}
295305

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) {
297307
var val reflect.Value
298308

299309
for containerType.Kind() == reflect.Ptr {
@@ -385,7 +395,7 @@ func (d *Decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
385395
}
386396
case 0x4:
387397
if containerType == tEmpty {
388-
d := NewDecoder(bytes.NewBuffer(v.ReaderArray()))
398+
d := newDecoder(bytes.NewBuffer(v.ReaderArray()))
389399
newVal, err := d.decodeBSONArrayToSlice(tEmptySlice)
390400
if err != nil {
391401
return val, err
@@ -397,7 +407,7 @@ func (d *Decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
397407
}
398408

399409
if containerType.Kind() == reflect.Slice {
400-
d := NewDecoder(bytes.NewBuffer(v.ReaderArray()))
410+
d := newDecoder(bytes.NewBuffer(v.ReaderArray()))
401411
newVal, err := d.decodeBSONArrayToSlice(containerType)
402412
if err != nil {
403413
return val, err
@@ -409,7 +419,7 @@ func (d *Decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
409419
}
410420

411421
if containerType.Kind() == reflect.Array {
412-
d := NewDecoder(bytes.NewBuffer(v.ReaderArray()))
422+
d := newDecoder(bytes.NewBuffer(v.ReaderArray()))
413423
newVal, err := d.decodeBSONArrayIntoArray(containerType)
414424
if err != nil {
415425
return val, err
@@ -662,7 +672,7 @@ func (d *Decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
662672
return val, nil
663673
}
664674

665-
func (d *Decoder) decodeIntoMap(mapVal reflect.Value) error {
675+
func (d *decoder) decodeIntoMap(mapVal reflect.Value) error {
666676
err := d.decodeToReader()
667677
if err != nil {
668678
return err
@@ -690,7 +700,7 @@ func (d *Decoder) decodeIntoMap(mapVal reflect.Value) error {
690700
return itr.Err()
691701
}
692702

693-
func (d *Decoder) decodeBSONArrayToSlice(sliceType reflect.Type) (reflect.Value, error) {
703+
func (d *decoder) decodeBSONArrayToSlice(sliceType reflect.Type) (reflect.Value, error) {
694704
var out reflect.Value
695705

696706
elems := make([]reflect.Value, 0)
@@ -737,7 +747,7 @@ func (d *Decoder) decodeBSONArrayToSlice(sliceType reflect.Type) (reflect.Value,
737747
return out, nil
738748
}
739749

740-
func (d *Decoder) decodeBSONArrayIntoArray(arrayType reflect.Type) (reflect.Value, error) {
750+
func (d *decoder) decodeBSONArrayIntoArray(arrayType reflect.Type) (reflect.Value, error) {
741751
length := arrayType.Len()
742752
arrayVal := reflect.New(arrayType)
743753

@@ -777,7 +787,7 @@ func (d *Decoder) decodeBSONArrayIntoArray(arrayType reflect.Type) (reflect.Valu
777787
return arrayVal.Elem(), nil
778788
}
779789

780-
func (d *Decoder) decodeIntoElementSlice(sliceVal reflect.Value) error {
790+
func (d *decoder) decodeIntoElementSlice(sliceVal reflect.Value) error {
781791
if sliceVal.Type().Elem() != tElement {
782792
return nil
783793
}
@@ -835,7 +845,7 @@ func matchesField(key string, field string, sType reflect.Type) bool {
835845
return fieldKey == key
836846
}
837847

838-
func (d *Decoder) decodeIntoStruct(structVal reflect.Value) error {
848+
func (d *decoder) decodeIntoStruct(structVal reflect.Value) error {
839849
err := d.decodeToReader()
840850
if err != nil {
841851
return err

0 commit comments

Comments
 (0)