github.com/mdaxf/iac@v0.0.0-20240519030858-58a061660378/vendor_skip/go.mongodb.org/mongo-driver/bson/bsonrw/value_reader.go (about)

     1  // Copyright (C) MongoDB, Inc. 2017-present.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License"); you may
     4  // not use this file except in compliance with the License. You may obtain
     5  // a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
     6  
     7  package bsonrw
     8  
     9  import (
    10  	"bytes"
    11  	"encoding/binary"
    12  	"errors"
    13  	"fmt"
    14  	"io"
    15  	"math"
    16  	"sync"
    17  
    18  	"go.mongodb.org/mongo-driver/bson/bsontype"
    19  	"go.mongodb.org/mongo-driver/bson/primitive"
    20  )
    21  
    22  var _ ValueReader = (*valueReader)(nil)
    23  
    24  var vrPool = sync.Pool{
    25  	New: func() interface{} {
    26  		return new(valueReader)
    27  	},
    28  }
    29  
    30  // BSONValueReaderPool is a pool for ValueReaders that read BSON.
    31  //
    32  // Deprecated: BSONValueReaderPool will not be supported in Go Driver 2.0.
    33  type BSONValueReaderPool struct {
    34  	pool sync.Pool
    35  }
    36  
    37  // NewBSONValueReaderPool instantiates a new BSONValueReaderPool.
    38  //
    39  // Deprecated: BSONValueReaderPool will not be supported in Go Driver 2.0.
    40  func NewBSONValueReaderPool() *BSONValueReaderPool {
    41  	return &BSONValueReaderPool{
    42  		pool: sync.Pool{
    43  			New: func() interface{} {
    44  				return new(valueReader)
    45  			},
    46  		},
    47  	}
    48  }
    49  
    50  // Get retrieves a ValueReader from the pool and uses src as the underlying BSON.
    51  //
    52  // Deprecated: BSONValueReaderPool will not be supported in Go Driver 2.0.
    53  func (bvrp *BSONValueReaderPool) Get(src []byte) ValueReader {
    54  	vr := bvrp.pool.Get().(*valueReader)
    55  	vr.reset(src)
    56  	return vr
    57  }
    58  
    59  // Put inserts a ValueReader into the pool. If the ValueReader is not a BSON ValueReader nothing
    60  // is inserted into the pool and ok will be false.
    61  //
    62  // Deprecated: BSONValueReaderPool will not be supported in Go Driver 2.0.
    63  func (bvrp *BSONValueReaderPool) Put(vr ValueReader) (ok bool) {
    64  	bvr, ok := vr.(*valueReader)
    65  	if !ok {
    66  		return false
    67  	}
    68  
    69  	bvr.reset(nil)
    70  	bvrp.pool.Put(bvr)
    71  	return true
    72  }
    73  
    74  // ErrEOA is the error returned when the end of a BSON array has been reached.
    75  var ErrEOA = errors.New("end of array")
    76  
    77  // ErrEOD is the error returned when the end of a BSON document has been reached.
    78  var ErrEOD = errors.New("end of document")
    79  
    80  type vrState struct {
    81  	mode  mode
    82  	vType bsontype.Type
    83  	end   int64
    84  }
    85  
    86  // valueReader is for reading BSON values.
    87  type valueReader struct {
    88  	offset int64
    89  	d      []byte
    90  
    91  	stack []vrState
    92  	frame int64
    93  }
    94  
    95  // NewBSONDocumentReader returns a ValueReader using b for the underlying BSON
    96  // representation. Parameter b must be a BSON Document.
    97  func NewBSONDocumentReader(b []byte) ValueReader {
    98  	// TODO(skriptble): There's a lack of symmetry between the reader and writer, since the reader takes a []byte while the
    99  	// TODO writer takes an io.Writer. We should have two versions of each, one that takes a []byte and one that takes an
   100  	// TODO io.Reader or io.Writer. The []byte version will need to return a thing that can return the finished []byte since
   101  	// TODO it might be reallocated when appended to.
   102  	return newValueReader(b)
   103  }
   104  
   105  // NewBSONValueReader returns a ValueReader that starts in the Value mode instead of in top
   106  // level document mode. This enables the creation of a ValueReader for a single BSON value.
   107  func NewBSONValueReader(t bsontype.Type, val []byte) ValueReader {
   108  	stack := make([]vrState, 1, 5)
   109  	stack[0] = vrState{
   110  		mode:  mValue,
   111  		vType: t,
   112  	}
   113  	return &valueReader{
   114  		d:     val,
   115  		stack: stack,
   116  	}
   117  }
   118  
   119  func newValueReader(b []byte) *valueReader {
   120  	stack := make([]vrState, 1, 5)
   121  	stack[0] = vrState{
   122  		mode: mTopLevel,
   123  	}
   124  	return &valueReader{
   125  		d:     b,
   126  		stack: stack,
   127  	}
   128  }
   129  
   130  func (vr *valueReader) reset(b []byte) {
   131  	if vr.stack == nil {
   132  		vr.stack = make([]vrState, 1, 5)
   133  	}
   134  	vr.stack = vr.stack[:1]
   135  	vr.stack[0] = vrState{mode: mTopLevel}
   136  	vr.d = b
   137  	vr.offset = 0
   138  	vr.frame = 0
   139  }
   140  
   141  func (vr *valueReader) advanceFrame() {
   142  	if vr.frame+1 >= int64(len(vr.stack)) { // We need to grow the stack
   143  		length := len(vr.stack)
   144  		if length+1 >= cap(vr.stack) {
   145  			// double it
   146  			buf := make([]vrState, 2*cap(vr.stack)+1)
   147  			copy(buf, vr.stack)
   148  			vr.stack = buf
   149  		}
   150  		vr.stack = vr.stack[:length+1]
   151  	}
   152  	vr.frame++
   153  
   154  	// Clean the stack
   155  	vr.stack[vr.frame].mode = 0
   156  	vr.stack[vr.frame].vType = 0
   157  	vr.stack[vr.frame].end = 0
   158  }
   159  
   160  func (vr *valueReader) pushDocument() error {
   161  	vr.advanceFrame()
   162  
   163  	vr.stack[vr.frame].mode = mDocument
   164  
   165  	size, err := vr.readLength()
   166  	if err != nil {
   167  		return err
   168  	}
   169  	vr.stack[vr.frame].end = int64(size) + vr.offset - 4
   170  
   171  	return nil
   172  }
   173  
   174  func (vr *valueReader) pushArray() error {
   175  	vr.advanceFrame()
   176  
   177  	vr.stack[vr.frame].mode = mArray
   178  
   179  	size, err := vr.readLength()
   180  	if err != nil {
   181  		return err
   182  	}
   183  	vr.stack[vr.frame].end = int64(size) + vr.offset - 4
   184  
   185  	return nil
   186  }
   187  
   188  func (vr *valueReader) pushElement(t bsontype.Type) {
   189  	vr.advanceFrame()
   190  
   191  	vr.stack[vr.frame].mode = mElement
   192  	vr.stack[vr.frame].vType = t
   193  }
   194  
   195  func (vr *valueReader) pushValue(t bsontype.Type) {
   196  	vr.advanceFrame()
   197  
   198  	vr.stack[vr.frame].mode = mValue
   199  	vr.stack[vr.frame].vType = t
   200  }
   201  
   202  func (vr *valueReader) pushCodeWithScope() (int64, error) {
   203  	vr.advanceFrame()
   204  
   205  	vr.stack[vr.frame].mode = mCodeWithScope
   206  
   207  	size, err := vr.readLength()
   208  	if err != nil {
   209  		return 0, err
   210  	}
   211  	vr.stack[vr.frame].end = int64(size) + vr.offset - 4
   212  
   213  	return int64(size), nil
   214  }
   215  
   216  func (vr *valueReader) pop() {
   217  	switch vr.stack[vr.frame].mode {
   218  	case mElement, mValue:
   219  		vr.frame--
   220  	case mDocument, mArray, mCodeWithScope:
   221  		vr.frame -= 2 // we pop twice to jump over the vrElement: vrDocument -> vrElement -> vrDocument/TopLevel/etc...
   222  	}
   223  }
   224  
   225  func (vr *valueReader) invalidTransitionErr(destination mode, name string, modes []mode) error {
   226  	te := TransitionError{
   227  		name:        name,
   228  		current:     vr.stack[vr.frame].mode,
   229  		destination: destination,
   230  		modes:       modes,
   231  		action:      "read",
   232  	}
   233  	if vr.frame != 0 {
   234  		te.parent = vr.stack[vr.frame-1].mode
   235  	}
   236  	return te
   237  }
   238  
   239  func (vr *valueReader) typeError(t bsontype.Type) error {
   240  	return fmt.Errorf("positioned on %s, but attempted to read %s", vr.stack[vr.frame].vType, t)
   241  }
   242  
   243  func (vr *valueReader) invalidDocumentLengthError() error {
   244  	return fmt.Errorf("document is invalid, end byte is at %d, but null byte found at %d", vr.stack[vr.frame].end, vr.offset)
   245  }
   246  
   247  func (vr *valueReader) ensureElementValue(t bsontype.Type, destination mode, callerName string) error {
   248  	switch vr.stack[vr.frame].mode {
   249  	case mElement, mValue:
   250  		if vr.stack[vr.frame].vType != t {
   251  			return vr.typeError(t)
   252  		}
   253  	default:
   254  		return vr.invalidTransitionErr(destination, callerName, []mode{mElement, mValue})
   255  	}
   256  
   257  	return nil
   258  }
   259  
   260  func (vr *valueReader) Type() bsontype.Type {
   261  	return vr.stack[vr.frame].vType
   262  }
   263  
   264  func (vr *valueReader) nextElementLength() (int32, error) {
   265  	var length int32
   266  	var err error
   267  	switch vr.stack[vr.frame].vType {
   268  	case bsontype.Array, bsontype.EmbeddedDocument, bsontype.CodeWithScope:
   269  		length, err = vr.peekLength()
   270  	case bsontype.Binary:
   271  		length, err = vr.peekLength()
   272  		length += 4 + 1 // binary length + subtype byte
   273  	case bsontype.Boolean:
   274  		length = 1
   275  	case bsontype.DBPointer:
   276  		length, err = vr.peekLength()
   277  		length += 4 + 12 // string length + ObjectID length
   278  	case bsontype.DateTime, bsontype.Double, bsontype.Int64, bsontype.Timestamp:
   279  		length = 8
   280  	case bsontype.Decimal128:
   281  		length = 16
   282  	case bsontype.Int32:
   283  		length = 4
   284  	case bsontype.JavaScript, bsontype.String, bsontype.Symbol:
   285  		length, err = vr.peekLength()
   286  		length += 4
   287  	case bsontype.MaxKey, bsontype.MinKey, bsontype.Null, bsontype.Undefined:
   288  		length = 0
   289  	case bsontype.ObjectID:
   290  		length = 12
   291  	case bsontype.Regex:
   292  		regex := bytes.IndexByte(vr.d[vr.offset:], 0x00)
   293  		if regex < 0 {
   294  			err = io.EOF
   295  			break
   296  		}
   297  		pattern := bytes.IndexByte(vr.d[vr.offset+int64(regex)+1:], 0x00)
   298  		if pattern < 0 {
   299  			err = io.EOF
   300  			break
   301  		}
   302  		length = int32(int64(regex) + 1 + int64(pattern) + 1)
   303  	default:
   304  		return 0, fmt.Errorf("attempted to read bytes of unknown BSON type %v", vr.stack[vr.frame].vType)
   305  	}
   306  
   307  	return length, err
   308  }
   309  
   310  func (vr *valueReader) ReadValueBytes(dst []byte) (bsontype.Type, []byte, error) {
   311  	switch vr.stack[vr.frame].mode {
   312  	case mTopLevel:
   313  		length, err := vr.peekLength()
   314  		if err != nil {
   315  			return bsontype.Type(0), nil, err
   316  		}
   317  		dst, err = vr.appendBytes(dst, length)
   318  		if err != nil {
   319  			return bsontype.Type(0), nil, err
   320  		}
   321  		return bsontype.Type(0), dst, nil
   322  	case mElement, mValue:
   323  		length, err := vr.nextElementLength()
   324  		if err != nil {
   325  			return bsontype.Type(0), dst, err
   326  		}
   327  
   328  		dst, err = vr.appendBytes(dst, length)
   329  		t := vr.stack[vr.frame].vType
   330  		vr.pop()
   331  		return t, dst, err
   332  	default:
   333  		return bsontype.Type(0), nil, vr.invalidTransitionErr(0, "ReadValueBytes", []mode{mElement, mValue})
   334  	}
   335  }
   336  
   337  func (vr *valueReader) Skip() error {
   338  	switch vr.stack[vr.frame].mode {
   339  	case mElement, mValue:
   340  	default:
   341  		return vr.invalidTransitionErr(0, "Skip", []mode{mElement, mValue})
   342  	}
   343  
   344  	length, err := vr.nextElementLength()
   345  	if err != nil {
   346  		return err
   347  	}
   348  
   349  	err = vr.skipBytes(length)
   350  	vr.pop()
   351  	return err
   352  }
   353  
   354  func (vr *valueReader) ReadArray() (ArrayReader, error) {
   355  	if err := vr.ensureElementValue(bsontype.Array, mArray, "ReadArray"); err != nil {
   356  		return nil, err
   357  	}
   358  
   359  	err := vr.pushArray()
   360  	if err != nil {
   361  		return nil, err
   362  	}
   363  
   364  	return vr, nil
   365  }
   366  
   367  func (vr *valueReader) ReadBinary() (b []byte, btype byte, err error) {
   368  	if err := vr.ensureElementValue(bsontype.Binary, 0, "ReadBinary"); err != nil {
   369  		return nil, 0, err
   370  	}
   371  
   372  	length, err := vr.readLength()
   373  	if err != nil {
   374  		return nil, 0, err
   375  	}
   376  
   377  	btype, err = vr.readByte()
   378  	if err != nil {
   379  		return nil, 0, err
   380  	}
   381  
   382  	// Check length in case it is an old binary without a length.
   383  	if btype == 0x02 && length > 4 {
   384  		length, err = vr.readLength()
   385  		if err != nil {
   386  			return nil, 0, err
   387  		}
   388  	}
   389  
   390  	b, err = vr.readBytes(length)
   391  	if err != nil {
   392  		return nil, 0, err
   393  	}
   394  	// Make a copy of the returned byte slice because it's just a subslice from the valueReader's
   395  	// buffer and is not safe to return in the unmarshaled value.
   396  	cp := make([]byte, len(b))
   397  	copy(cp, b)
   398  
   399  	vr.pop()
   400  	return cp, btype, nil
   401  }
   402  
   403  func (vr *valueReader) ReadBoolean() (bool, error) {
   404  	if err := vr.ensureElementValue(bsontype.Boolean, 0, "ReadBoolean"); err != nil {
   405  		return false, err
   406  	}
   407  
   408  	b, err := vr.readByte()
   409  	if err != nil {
   410  		return false, err
   411  	}
   412  
   413  	if b > 1 {
   414  		return false, fmt.Errorf("invalid byte for boolean, %b", b)
   415  	}
   416  
   417  	vr.pop()
   418  	return b == 1, nil
   419  }
   420  
   421  func (vr *valueReader) ReadDocument() (DocumentReader, error) {
   422  	switch vr.stack[vr.frame].mode {
   423  	case mTopLevel:
   424  		// read size
   425  		size, err := vr.readLength()
   426  		if err != nil {
   427  			return nil, err
   428  		}
   429  		if int(size) != len(vr.d) {
   430  			return nil, fmt.Errorf("invalid document length")
   431  		}
   432  		vr.stack[vr.frame].end = int64(size) + vr.offset - 4
   433  		return vr, nil
   434  	case mElement, mValue:
   435  		if vr.stack[vr.frame].vType != bsontype.EmbeddedDocument {
   436  			return nil, vr.typeError(bsontype.EmbeddedDocument)
   437  		}
   438  	default:
   439  		return nil, vr.invalidTransitionErr(mDocument, "ReadDocument", []mode{mTopLevel, mElement, mValue})
   440  	}
   441  
   442  	err := vr.pushDocument()
   443  	if err != nil {
   444  		return nil, err
   445  	}
   446  
   447  	return vr, nil
   448  }
   449  
   450  func (vr *valueReader) ReadCodeWithScope() (code string, dr DocumentReader, err error) {
   451  	if err := vr.ensureElementValue(bsontype.CodeWithScope, 0, "ReadCodeWithScope"); err != nil {
   452  		return "", nil, err
   453  	}
   454  
   455  	totalLength, err := vr.readLength()
   456  	if err != nil {
   457  		return "", nil, err
   458  	}
   459  	strLength, err := vr.readLength()
   460  	if err != nil {
   461  		return "", nil, err
   462  	}
   463  	if strLength <= 0 {
   464  		return "", nil, fmt.Errorf("invalid string length: %d", strLength)
   465  	}
   466  	strBytes, err := vr.readBytes(strLength)
   467  	if err != nil {
   468  		return "", nil, err
   469  	}
   470  	code = string(strBytes[:len(strBytes)-1])
   471  
   472  	size, err := vr.pushCodeWithScope()
   473  	if err != nil {
   474  		return "", nil, err
   475  	}
   476  
   477  	// The total length should equal:
   478  	// 4 (total length) + strLength + 4 (the length of str itself) + (document length)
   479  	componentsLength := int64(4+strLength+4) + size
   480  	if int64(totalLength) != componentsLength {
   481  		return "", nil, fmt.Errorf(
   482  			"length of CodeWithScope does not match lengths of components; total: %d; components: %d",
   483  			totalLength, componentsLength,
   484  		)
   485  	}
   486  	return code, vr, nil
   487  }
   488  
   489  func (vr *valueReader) ReadDBPointer() (ns string, oid primitive.ObjectID, err error) {
   490  	if err := vr.ensureElementValue(bsontype.DBPointer, 0, "ReadDBPointer"); err != nil {
   491  		return "", oid, err
   492  	}
   493  
   494  	ns, err = vr.readString()
   495  	if err != nil {
   496  		return "", oid, err
   497  	}
   498  
   499  	oidbytes, err := vr.readBytes(12)
   500  	if err != nil {
   501  		return "", oid, err
   502  	}
   503  
   504  	copy(oid[:], oidbytes)
   505  
   506  	vr.pop()
   507  	return ns, oid, nil
   508  }
   509  
   510  func (vr *valueReader) ReadDateTime() (int64, error) {
   511  	if err := vr.ensureElementValue(bsontype.DateTime, 0, "ReadDateTime"); err != nil {
   512  		return 0, err
   513  	}
   514  
   515  	i, err := vr.readi64()
   516  	if err != nil {
   517  		return 0, err
   518  	}
   519  
   520  	vr.pop()
   521  	return i, nil
   522  }
   523  
   524  func (vr *valueReader) ReadDecimal128() (primitive.Decimal128, error) {
   525  	if err := vr.ensureElementValue(bsontype.Decimal128, 0, "ReadDecimal128"); err != nil {
   526  		return primitive.Decimal128{}, err
   527  	}
   528  
   529  	b, err := vr.readBytes(16)
   530  	if err != nil {
   531  		return primitive.Decimal128{}, err
   532  	}
   533  
   534  	l := binary.LittleEndian.Uint64(b[0:8])
   535  	h := binary.LittleEndian.Uint64(b[8:16])
   536  
   537  	vr.pop()
   538  	return primitive.NewDecimal128(h, l), nil
   539  }
   540  
   541  func (vr *valueReader) ReadDouble() (float64, error) {
   542  	if err := vr.ensureElementValue(bsontype.Double, 0, "ReadDouble"); err != nil {
   543  		return 0, err
   544  	}
   545  
   546  	u, err := vr.readu64()
   547  	if err != nil {
   548  		return 0, err
   549  	}
   550  
   551  	vr.pop()
   552  	return math.Float64frombits(u), nil
   553  }
   554  
   555  func (vr *valueReader) ReadInt32() (int32, error) {
   556  	if err := vr.ensureElementValue(bsontype.Int32, 0, "ReadInt32"); err != nil {
   557  		return 0, err
   558  	}
   559  
   560  	vr.pop()
   561  	return vr.readi32()
   562  }
   563  
   564  func (vr *valueReader) ReadInt64() (int64, error) {
   565  	if err := vr.ensureElementValue(bsontype.Int64, 0, "ReadInt64"); err != nil {
   566  		return 0, err
   567  	}
   568  
   569  	vr.pop()
   570  	return vr.readi64()
   571  }
   572  
   573  func (vr *valueReader) ReadJavascript() (code string, err error) {
   574  	if err := vr.ensureElementValue(bsontype.JavaScript, 0, "ReadJavascript"); err != nil {
   575  		return "", err
   576  	}
   577  
   578  	vr.pop()
   579  	return vr.readString()
   580  }
   581  
   582  func (vr *valueReader) ReadMaxKey() error {
   583  	if err := vr.ensureElementValue(bsontype.MaxKey, 0, "ReadMaxKey"); err != nil {
   584  		return err
   585  	}
   586  
   587  	vr.pop()
   588  	return nil
   589  }
   590  
   591  func (vr *valueReader) ReadMinKey() error {
   592  	if err := vr.ensureElementValue(bsontype.MinKey, 0, "ReadMinKey"); err != nil {
   593  		return err
   594  	}
   595  
   596  	vr.pop()
   597  	return nil
   598  }
   599  
   600  func (vr *valueReader) ReadNull() error {
   601  	if err := vr.ensureElementValue(bsontype.Null, 0, "ReadNull"); err != nil {
   602  		return err
   603  	}
   604  
   605  	vr.pop()
   606  	return nil
   607  }
   608  
   609  func (vr *valueReader) ReadObjectID() (primitive.ObjectID, error) {
   610  	if err := vr.ensureElementValue(bsontype.ObjectID, 0, "ReadObjectID"); err != nil {
   611  		return primitive.ObjectID{}, err
   612  	}
   613  
   614  	oidbytes, err := vr.readBytes(12)
   615  	if err != nil {
   616  		return primitive.ObjectID{}, err
   617  	}
   618  
   619  	var oid primitive.ObjectID
   620  	copy(oid[:], oidbytes)
   621  
   622  	vr.pop()
   623  	return oid, nil
   624  }
   625  
   626  func (vr *valueReader) ReadRegex() (string, string, error) {
   627  	if err := vr.ensureElementValue(bsontype.Regex, 0, "ReadRegex"); err != nil {
   628  		return "", "", err
   629  	}
   630  
   631  	pattern, err := vr.readCString()
   632  	if err != nil {
   633  		return "", "", err
   634  	}
   635  
   636  	options, err := vr.readCString()
   637  	if err != nil {
   638  		return "", "", err
   639  	}
   640  
   641  	vr.pop()
   642  	return pattern, options, nil
   643  }
   644  
   645  func (vr *valueReader) ReadString() (string, error) {
   646  	if err := vr.ensureElementValue(bsontype.String, 0, "ReadString"); err != nil {
   647  		return "", err
   648  	}
   649  
   650  	vr.pop()
   651  	return vr.readString()
   652  }
   653  
   654  func (vr *valueReader) ReadSymbol() (symbol string, err error) {
   655  	if err := vr.ensureElementValue(bsontype.Symbol, 0, "ReadSymbol"); err != nil {
   656  		return "", err
   657  	}
   658  
   659  	vr.pop()
   660  	return vr.readString()
   661  }
   662  
   663  func (vr *valueReader) ReadTimestamp() (t uint32, i uint32, err error) {
   664  	if err := vr.ensureElementValue(bsontype.Timestamp, 0, "ReadTimestamp"); err != nil {
   665  		return 0, 0, err
   666  	}
   667  
   668  	i, err = vr.readu32()
   669  	if err != nil {
   670  		return 0, 0, err
   671  	}
   672  
   673  	t, err = vr.readu32()
   674  	if err != nil {
   675  		return 0, 0, err
   676  	}
   677  
   678  	vr.pop()
   679  	return t, i, nil
   680  }
   681  
   682  func (vr *valueReader) ReadUndefined() error {
   683  	if err := vr.ensureElementValue(bsontype.Undefined, 0, "ReadUndefined"); err != nil {
   684  		return err
   685  	}
   686  
   687  	vr.pop()
   688  	return nil
   689  }
   690  
   691  func (vr *valueReader) ReadElement() (string, ValueReader, error) {
   692  	switch vr.stack[vr.frame].mode {
   693  	case mTopLevel, mDocument, mCodeWithScope:
   694  	default:
   695  		return "", nil, vr.invalidTransitionErr(mElement, "ReadElement", []mode{mTopLevel, mDocument, mCodeWithScope})
   696  	}
   697  
   698  	t, err := vr.readByte()
   699  	if err != nil {
   700  		return "", nil, err
   701  	}
   702  
   703  	if t == 0 {
   704  		if vr.offset != vr.stack[vr.frame].end {
   705  			return "", nil, vr.invalidDocumentLengthError()
   706  		}
   707  
   708  		vr.pop()
   709  		return "", nil, ErrEOD
   710  	}
   711  
   712  	name, err := vr.readCString()
   713  	if err != nil {
   714  		return "", nil, err
   715  	}
   716  
   717  	vr.pushElement(bsontype.Type(t))
   718  	return name, vr, nil
   719  }
   720  
   721  func (vr *valueReader) ReadValue() (ValueReader, error) {
   722  	switch vr.stack[vr.frame].mode {
   723  	case mArray:
   724  	default:
   725  		return nil, vr.invalidTransitionErr(mValue, "ReadValue", []mode{mArray})
   726  	}
   727  
   728  	t, err := vr.readByte()
   729  	if err != nil {
   730  		return nil, err
   731  	}
   732  
   733  	if t == 0 {
   734  		if vr.offset != vr.stack[vr.frame].end {
   735  			return nil, vr.invalidDocumentLengthError()
   736  		}
   737  
   738  		vr.pop()
   739  		return nil, ErrEOA
   740  	}
   741  
   742  	_, err = vr.readCString()
   743  	if err != nil {
   744  		return nil, err
   745  	}
   746  
   747  	vr.pushValue(bsontype.Type(t))
   748  	return vr, nil
   749  }
   750  
   751  // readBytes reads length bytes from the valueReader starting at the current offset. Note that the
   752  // returned byte slice is a subslice from the valueReader buffer and must be converted or copied
   753  // before returning in an unmarshaled value.
   754  func (vr *valueReader) readBytes(length int32) ([]byte, error) {
   755  	if length < 0 {
   756  		return nil, fmt.Errorf("invalid length: %d", length)
   757  	}
   758  
   759  	if vr.offset+int64(length) > int64(len(vr.d)) {
   760  		return nil, io.EOF
   761  	}
   762  
   763  	start := vr.offset
   764  	vr.offset += int64(length)
   765  
   766  	return vr.d[start : start+int64(length)], nil
   767  }
   768  
   769  func (vr *valueReader) appendBytes(dst []byte, length int32) ([]byte, error) {
   770  	if vr.offset+int64(length) > int64(len(vr.d)) {
   771  		return nil, io.EOF
   772  	}
   773  
   774  	start := vr.offset
   775  	vr.offset += int64(length)
   776  	return append(dst, vr.d[start:start+int64(length)]...), nil
   777  }
   778  
   779  func (vr *valueReader) skipBytes(length int32) error {
   780  	if vr.offset+int64(length) > int64(len(vr.d)) {
   781  		return io.EOF
   782  	}
   783  
   784  	vr.offset += int64(length)
   785  	return nil
   786  }
   787  
   788  func (vr *valueReader) readByte() (byte, error) {
   789  	if vr.offset+1 > int64(len(vr.d)) {
   790  		return 0x0, io.EOF
   791  	}
   792  
   793  	vr.offset++
   794  	return vr.d[vr.offset-1], nil
   795  }
   796  
   797  func (vr *valueReader) readCString() (string, error) {
   798  	idx := bytes.IndexByte(vr.d[vr.offset:], 0x00)
   799  	if idx < 0 {
   800  		return "", io.EOF
   801  	}
   802  	start := vr.offset
   803  	// idx does not include the null byte
   804  	vr.offset += int64(idx) + 1
   805  	return string(vr.d[start : start+int64(idx)]), nil
   806  }
   807  
   808  func (vr *valueReader) readString() (string, error) {
   809  	length, err := vr.readLength()
   810  	if err != nil {
   811  		return "", err
   812  	}
   813  
   814  	if int64(length)+vr.offset > int64(len(vr.d)) {
   815  		return "", io.EOF
   816  	}
   817  
   818  	if length <= 0 {
   819  		return "", fmt.Errorf("invalid string length: %d", length)
   820  	}
   821  
   822  	if vr.d[vr.offset+int64(length)-1] != 0x00 {
   823  		return "", fmt.Errorf("string does not end with null byte, but with %v", vr.d[vr.offset+int64(length)-1])
   824  	}
   825  
   826  	start := vr.offset
   827  	vr.offset += int64(length)
   828  	return string(vr.d[start : start+int64(length)-1]), nil
   829  }
   830  
   831  func (vr *valueReader) peekLength() (int32, error) {
   832  	if vr.offset+4 > int64(len(vr.d)) {
   833  		return 0, io.EOF
   834  	}
   835  
   836  	idx := vr.offset
   837  	return (int32(vr.d[idx]) | int32(vr.d[idx+1])<<8 | int32(vr.d[idx+2])<<16 | int32(vr.d[idx+3])<<24), nil
   838  }
   839  
   840  func (vr *valueReader) readLength() (int32, error) { return vr.readi32() }
   841  
   842  func (vr *valueReader) readi32() (int32, error) {
   843  	if vr.offset+4 > int64(len(vr.d)) {
   844  		return 0, io.EOF
   845  	}
   846  
   847  	idx := vr.offset
   848  	vr.offset += 4
   849  	return (int32(vr.d[idx]) | int32(vr.d[idx+1])<<8 | int32(vr.d[idx+2])<<16 | int32(vr.d[idx+3])<<24), nil
   850  }
   851  
   852  func (vr *valueReader) readu32() (uint32, error) {
   853  	if vr.offset+4 > int64(len(vr.d)) {
   854  		return 0, io.EOF
   855  	}
   856  
   857  	idx := vr.offset
   858  	vr.offset += 4
   859  	return (uint32(vr.d[idx]) | uint32(vr.d[idx+1])<<8 | uint32(vr.d[idx+2])<<16 | uint32(vr.d[idx+3])<<24), nil
   860  }
   861  
   862  func (vr *valueReader) readi64() (int64, error) {
   863  	if vr.offset+8 > int64(len(vr.d)) {
   864  		return 0, io.EOF
   865  	}
   866  
   867  	idx := vr.offset
   868  	vr.offset += 8
   869  	return int64(vr.d[idx]) | int64(vr.d[idx+1])<<8 | int64(vr.d[idx+2])<<16 | int64(vr.d[idx+3])<<24 |
   870  		int64(vr.d[idx+4])<<32 | int64(vr.d[idx+5])<<40 | int64(vr.d[idx+6])<<48 | int64(vr.d[idx+7])<<56, nil
   871  }
   872  
   873  func (vr *valueReader) readu64() (uint64, error) {
   874  	if vr.offset+8 > int64(len(vr.d)) {
   875  		return 0, io.EOF
   876  	}
   877  
   878  	idx := vr.offset
   879  	vr.offset += 8
   880  	return uint64(vr.d[idx]) | uint64(vr.d[idx+1])<<8 | uint64(vr.d[idx+2])<<16 | uint64(vr.d[idx+3])<<24 |
   881  		uint64(vr.d[idx+4])<<32 | uint64(vr.d[idx+5])<<40 | uint64(vr.d[idx+6])<<48 | uint64(vr.d[idx+7])<<56, nil
   882  }