...

Source file src/go.mongodb.org/mongo-driver/bson/bsonrw/bsonrwtest/bsonrwtest.go

Documentation: go.mongodb.org/mongo-driver/bson/bsonrw/bsonrwtest

     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 bsonrwtest provides utilities for testing the "bson/bsonrw" package.
     8  package bsonrwtest // import "go.mongodb.org/mongo-driver/bson/bsonrw/bsonrwtest"
     9  
    10  import (
    11  	"testing"
    12  
    13  	"go.mongodb.org/mongo-driver/bson/bsonrw"
    14  	"go.mongodb.org/mongo-driver/bson/bsontype"
    15  	"go.mongodb.org/mongo-driver/bson/primitive"
    16  	"go.mongodb.org/mongo-driver/x/bsonx/bsoncore"
    17  )
    18  
    19  var _ bsonrw.ValueReader = (*ValueReaderWriter)(nil)
    20  var _ bsonrw.ValueWriter = (*ValueReaderWriter)(nil)
    21  
    22  // Invoked is a type used to indicate what method was called last.
    23  type Invoked byte
    24  
    25  // These are the different methods that can be invoked.
    26  const (
    27  	Nothing Invoked = iota
    28  	ReadArray
    29  	ReadBinary
    30  	ReadBoolean
    31  	ReadDocument
    32  	ReadCodeWithScope
    33  	ReadDBPointer
    34  	ReadDateTime
    35  	ReadDecimal128
    36  	ReadDouble
    37  	ReadInt32
    38  	ReadInt64
    39  	ReadJavascript
    40  	ReadMaxKey
    41  	ReadMinKey
    42  	ReadNull
    43  	ReadObjectID
    44  	ReadRegex
    45  	ReadString
    46  	ReadSymbol
    47  	ReadTimestamp
    48  	ReadUndefined
    49  	ReadElement
    50  	ReadValue
    51  	WriteArray
    52  	WriteBinary
    53  	WriteBinaryWithSubtype
    54  	WriteBoolean
    55  	WriteCodeWithScope
    56  	WriteDBPointer
    57  	WriteDateTime
    58  	WriteDecimal128
    59  	WriteDouble
    60  	WriteInt32
    61  	WriteInt64
    62  	WriteJavascript
    63  	WriteMaxKey
    64  	WriteMinKey
    65  	WriteNull
    66  	WriteObjectID
    67  	WriteRegex
    68  	WriteString
    69  	WriteDocument
    70  	WriteSymbol
    71  	WriteTimestamp
    72  	WriteUndefined
    73  	WriteDocumentElement
    74  	WriteDocumentEnd
    75  	WriteArrayElement
    76  	WriteArrayEnd
    77  	Skip
    78  )
    79  
    80  func (i Invoked) String() string {
    81  	switch i {
    82  	case Nothing:
    83  		return "Nothing"
    84  	case ReadArray:
    85  		return "ReadArray"
    86  	case ReadBinary:
    87  		return "ReadBinary"
    88  	case ReadBoolean:
    89  		return "ReadBoolean"
    90  	case ReadDocument:
    91  		return "ReadDocument"
    92  	case ReadCodeWithScope:
    93  		return "ReadCodeWithScope"
    94  	case ReadDBPointer:
    95  		return "ReadDBPointer"
    96  	case ReadDateTime:
    97  		return "ReadDateTime"
    98  	case ReadDecimal128:
    99  		return "ReadDecimal128"
   100  	case ReadDouble:
   101  		return "ReadDouble"
   102  	case ReadInt32:
   103  		return "ReadInt32"
   104  	case ReadInt64:
   105  		return "ReadInt64"
   106  	case ReadJavascript:
   107  		return "ReadJavascript"
   108  	case ReadMaxKey:
   109  		return "ReadMaxKey"
   110  	case ReadMinKey:
   111  		return "ReadMinKey"
   112  	case ReadNull:
   113  		return "ReadNull"
   114  	case ReadObjectID:
   115  		return "ReadObjectID"
   116  	case ReadRegex:
   117  		return "ReadRegex"
   118  	case ReadString:
   119  		return "ReadString"
   120  	case ReadSymbol:
   121  		return "ReadSymbol"
   122  	case ReadTimestamp:
   123  		return "ReadTimestamp"
   124  	case ReadUndefined:
   125  		return "ReadUndefined"
   126  	case ReadElement:
   127  		return "ReadElement"
   128  	case ReadValue:
   129  		return "ReadValue"
   130  	case WriteArray:
   131  		return "WriteArray"
   132  	case WriteBinary:
   133  		return "WriteBinary"
   134  	case WriteBinaryWithSubtype:
   135  		return "WriteBinaryWithSubtype"
   136  	case WriteBoolean:
   137  		return "WriteBoolean"
   138  	case WriteCodeWithScope:
   139  		return "WriteCodeWithScope"
   140  	case WriteDBPointer:
   141  		return "WriteDBPointer"
   142  	case WriteDateTime:
   143  		return "WriteDateTime"
   144  	case WriteDecimal128:
   145  		return "WriteDecimal128"
   146  	case WriteDouble:
   147  		return "WriteDouble"
   148  	case WriteInt32:
   149  		return "WriteInt32"
   150  	case WriteInt64:
   151  		return "WriteInt64"
   152  	case WriteJavascript:
   153  		return "WriteJavascript"
   154  	case WriteMaxKey:
   155  		return "WriteMaxKey"
   156  	case WriteMinKey:
   157  		return "WriteMinKey"
   158  	case WriteNull:
   159  		return "WriteNull"
   160  	case WriteObjectID:
   161  		return "WriteObjectID"
   162  	case WriteRegex:
   163  		return "WriteRegex"
   164  	case WriteString:
   165  		return "WriteString"
   166  	case WriteDocument:
   167  		return "WriteDocument"
   168  	case WriteSymbol:
   169  		return "WriteSymbol"
   170  	case WriteTimestamp:
   171  		return "WriteTimestamp"
   172  	case WriteUndefined:
   173  		return "WriteUndefined"
   174  	case WriteDocumentElement:
   175  		return "WriteDocumentElement"
   176  	case WriteDocumentEnd:
   177  		return "WriteDocumentEnd"
   178  	case WriteArrayElement:
   179  		return "WriteArrayElement"
   180  	case WriteArrayEnd:
   181  		return "WriteArrayEnd"
   182  	default:
   183  		return "<unknown>"
   184  	}
   185  }
   186  
   187  // ValueReaderWriter is a test implementation of a bsonrw.ValueReader and bsonrw.ValueWriter
   188  type ValueReaderWriter struct {
   189  	T        *testing.T
   190  	Invoked  Invoked
   191  	Return   interface{} // Can be a primitive or a bsoncore.Value
   192  	BSONType bsontype.Type
   193  	Err      error
   194  	ErrAfter Invoked // error after this method is called
   195  	depth    uint64
   196  }
   197  
   198  // prevent infinite recursion.
   199  func (llvrw *ValueReaderWriter) checkdepth() {
   200  	llvrw.depth++
   201  	if llvrw.depth > 1000 {
   202  		panic("max depth exceeded")
   203  	}
   204  }
   205  
   206  // Type implements the bsonrw.ValueReader interface.
   207  func (llvrw *ValueReaderWriter) Type() bsontype.Type {
   208  	llvrw.checkdepth()
   209  	return llvrw.BSONType
   210  }
   211  
   212  // Skip implements the bsonrw.ValueReader interface.
   213  func (llvrw *ValueReaderWriter) Skip() error {
   214  	llvrw.checkdepth()
   215  	llvrw.Invoked = Skip
   216  	if llvrw.ErrAfter == llvrw.Invoked {
   217  		return llvrw.Err
   218  	}
   219  	return nil
   220  }
   221  
   222  // ReadArray implements the bsonrw.ValueReader interface.
   223  func (llvrw *ValueReaderWriter) ReadArray() (bsonrw.ArrayReader, error) {
   224  	llvrw.checkdepth()
   225  	llvrw.Invoked = ReadArray
   226  	if llvrw.ErrAfter == llvrw.Invoked {
   227  		return nil, llvrw.Err
   228  	}
   229  
   230  	return llvrw, nil
   231  }
   232  
   233  // ReadBinary implements the bsonrw.ValueReader interface.
   234  func (llvrw *ValueReaderWriter) ReadBinary() (b []byte, btype byte, err error) {
   235  	llvrw.checkdepth()
   236  	llvrw.Invoked = ReadBinary
   237  	if llvrw.ErrAfter == llvrw.Invoked {
   238  		return nil, 0x00, llvrw.Err
   239  	}
   240  
   241  	switch tt := llvrw.Return.(type) {
   242  	case bsoncore.Value:
   243  		subtype, data, _, ok := bsoncore.ReadBinary(tt.Data)
   244  		if !ok {
   245  			llvrw.T.Error("Invalid Value provided for return value of ReadBinary.")
   246  			return nil, 0x00, nil
   247  		}
   248  		return data, subtype, nil
   249  	default:
   250  		llvrw.T.Errorf("Incorrect type provided for return value of ReadBinary: %T", llvrw.Return)
   251  		return nil, 0x00, nil
   252  	}
   253  }
   254  
   255  // ReadBoolean implements the bsonrw.ValueReader interface.
   256  func (llvrw *ValueReaderWriter) ReadBoolean() (bool, error) {
   257  	llvrw.checkdepth()
   258  	llvrw.Invoked = ReadBoolean
   259  	if llvrw.ErrAfter == llvrw.Invoked {
   260  		return false, llvrw.Err
   261  	}
   262  
   263  	switch tt := llvrw.Return.(type) {
   264  	case bool:
   265  		return tt, nil
   266  	case bsoncore.Value:
   267  		b, _, ok := bsoncore.ReadBoolean(tt.Data)
   268  		if !ok {
   269  			llvrw.T.Error("Invalid Value provided for return value of ReadBoolean.")
   270  			return false, nil
   271  		}
   272  		return b, nil
   273  	default:
   274  		llvrw.T.Errorf("Incorrect type provided for return value of ReadBoolean: %T", llvrw.Return)
   275  		return false, nil
   276  	}
   277  }
   278  
   279  // ReadDocument implements the bsonrw.ValueReader interface.
   280  func (llvrw *ValueReaderWriter) ReadDocument() (bsonrw.DocumentReader, error) {
   281  	llvrw.checkdepth()
   282  	llvrw.Invoked = ReadDocument
   283  	if llvrw.ErrAfter == llvrw.Invoked {
   284  		return nil, llvrw.Err
   285  	}
   286  
   287  	return llvrw, nil
   288  }
   289  
   290  // ReadCodeWithScope implements the bsonrw.ValueReader interface.
   291  func (llvrw *ValueReaderWriter) ReadCodeWithScope() (code string, dr bsonrw.DocumentReader, err error) {
   292  	llvrw.checkdepth()
   293  	llvrw.Invoked = ReadCodeWithScope
   294  	if llvrw.ErrAfter == llvrw.Invoked {
   295  		return "", nil, llvrw.Err
   296  	}
   297  
   298  	return "", llvrw, nil
   299  }
   300  
   301  // ReadDBPointer implements the bsonrw.ValueReader interface.
   302  func (llvrw *ValueReaderWriter) ReadDBPointer() (ns string, oid primitive.ObjectID, err error) {
   303  	llvrw.checkdepth()
   304  	llvrw.Invoked = ReadDBPointer
   305  	if llvrw.ErrAfter == llvrw.Invoked {
   306  		return "", primitive.ObjectID{}, llvrw.Err
   307  	}
   308  
   309  	switch tt := llvrw.Return.(type) {
   310  	case bsoncore.Value:
   311  		ns, oid, _, ok := bsoncore.ReadDBPointer(tt.Data)
   312  		if !ok {
   313  			llvrw.T.Error("Invalid Value instance provided for return value of ReadDBPointer")
   314  			return "", primitive.ObjectID{}, nil
   315  		}
   316  		return ns, oid, nil
   317  	default:
   318  		llvrw.T.Errorf("Incorrect type provided for return value of ReadDBPointer: %T", llvrw.Return)
   319  		return "", primitive.ObjectID{}, nil
   320  	}
   321  }
   322  
   323  // ReadDateTime implements the bsonrw.ValueReader interface.
   324  func (llvrw *ValueReaderWriter) ReadDateTime() (int64, error) {
   325  	llvrw.checkdepth()
   326  	llvrw.Invoked = ReadDateTime
   327  	if llvrw.ErrAfter == llvrw.Invoked {
   328  		return 0, llvrw.Err
   329  	}
   330  
   331  	dt, ok := llvrw.Return.(int64)
   332  	if !ok {
   333  		llvrw.T.Errorf("Incorrect type provided for return value of ReadDateTime: %T", llvrw.Return)
   334  		return 0, nil
   335  	}
   336  
   337  	return dt, nil
   338  }
   339  
   340  // ReadDecimal128 implements the bsonrw.ValueReader interface.
   341  func (llvrw *ValueReaderWriter) ReadDecimal128() (primitive.Decimal128, error) {
   342  	llvrw.checkdepth()
   343  	llvrw.Invoked = ReadDecimal128
   344  	if llvrw.ErrAfter == llvrw.Invoked {
   345  		return primitive.Decimal128{}, llvrw.Err
   346  	}
   347  
   348  	d128, ok := llvrw.Return.(primitive.Decimal128)
   349  	if !ok {
   350  		llvrw.T.Errorf("Incorrect type provided for return value of ReadDecimal128: %T", llvrw.Return)
   351  		return primitive.Decimal128{}, nil
   352  	}
   353  
   354  	return d128, nil
   355  }
   356  
   357  // ReadDouble implements the bsonrw.ValueReader interface.
   358  func (llvrw *ValueReaderWriter) ReadDouble() (float64, error) {
   359  	llvrw.checkdepth()
   360  	llvrw.Invoked = ReadDouble
   361  	if llvrw.ErrAfter == llvrw.Invoked {
   362  		return 0, llvrw.Err
   363  	}
   364  
   365  	f64, ok := llvrw.Return.(float64)
   366  	if !ok {
   367  		llvrw.T.Errorf("Incorrect type provided for return value of ReadDouble: %T", llvrw.Return)
   368  		return 0, nil
   369  	}
   370  
   371  	return f64, nil
   372  }
   373  
   374  // ReadInt32 implements the bsonrw.ValueReader interface.
   375  func (llvrw *ValueReaderWriter) ReadInt32() (int32, error) {
   376  	llvrw.checkdepth()
   377  	llvrw.Invoked = ReadInt32
   378  	if llvrw.ErrAfter == llvrw.Invoked {
   379  		return 0, llvrw.Err
   380  	}
   381  
   382  	i32, ok := llvrw.Return.(int32)
   383  	if !ok {
   384  		llvrw.T.Errorf("Incorrect type provided for return value of ReadInt32: %T", llvrw.Return)
   385  		return 0, nil
   386  	}
   387  
   388  	return i32, nil
   389  }
   390  
   391  // ReadInt64 implements the bsonrw.ValueReader interface.
   392  func (llvrw *ValueReaderWriter) ReadInt64() (int64, error) {
   393  	llvrw.checkdepth()
   394  	llvrw.Invoked = ReadInt64
   395  	if llvrw.ErrAfter == llvrw.Invoked {
   396  		return 0, llvrw.Err
   397  	}
   398  	i64, ok := llvrw.Return.(int64)
   399  	if !ok {
   400  		llvrw.T.Errorf("Incorrect type provided for return value of ReadInt64: %T", llvrw.Return)
   401  		return 0, nil
   402  	}
   403  
   404  	return i64, nil
   405  }
   406  
   407  // ReadJavascript implements the bsonrw.ValueReader interface.
   408  func (llvrw *ValueReaderWriter) ReadJavascript() (code string, err error) {
   409  	llvrw.checkdepth()
   410  	llvrw.Invoked = ReadJavascript
   411  	if llvrw.ErrAfter == llvrw.Invoked {
   412  		return "", llvrw.Err
   413  	}
   414  	js, ok := llvrw.Return.(string)
   415  	if !ok {
   416  		llvrw.T.Errorf("Incorrect type provided for return value of ReadJavascript: %T", llvrw.Return)
   417  		return "", nil
   418  	}
   419  
   420  	return js, nil
   421  }
   422  
   423  // ReadMaxKey implements the bsonrw.ValueReader interface.
   424  func (llvrw *ValueReaderWriter) ReadMaxKey() error {
   425  	llvrw.checkdepth()
   426  	llvrw.Invoked = ReadMaxKey
   427  	if llvrw.ErrAfter == llvrw.Invoked {
   428  		return llvrw.Err
   429  	}
   430  
   431  	return nil
   432  }
   433  
   434  // ReadMinKey implements the bsonrw.ValueReader interface.
   435  func (llvrw *ValueReaderWriter) ReadMinKey() error {
   436  	llvrw.checkdepth()
   437  	llvrw.Invoked = ReadMinKey
   438  	if llvrw.ErrAfter == llvrw.Invoked {
   439  		return llvrw.Err
   440  	}
   441  
   442  	return nil
   443  }
   444  
   445  // ReadNull implements the bsonrw.ValueReader interface.
   446  func (llvrw *ValueReaderWriter) ReadNull() error {
   447  	llvrw.checkdepth()
   448  	llvrw.Invoked = ReadNull
   449  	if llvrw.ErrAfter == llvrw.Invoked {
   450  		return llvrw.Err
   451  	}
   452  
   453  	return nil
   454  }
   455  
   456  // ReadObjectID implements the bsonrw.ValueReader interface.
   457  func (llvrw *ValueReaderWriter) ReadObjectID() (primitive.ObjectID, error) {
   458  	llvrw.checkdepth()
   459  	llvrw.Invoked = ReadObjectID
   460  	if llvrw.ErrAfter == llvrw.Invoked {
   461  		return primitive.ObjectID{}, llvrw.Err
   462  	}
   463  	oid, ok := llvrw.Return.(primitive.ObjectID)
   464  	if !ok {
   465  		llvrw.T.Errorf("Incorrect type provided for return value of ReadObjectID: %T", llvrw.Return)
   466  		return primitive.ObjectID{}, nil
   467  	}
   468  
   469  	return oid, nil
   470  }
   471  
   472  // ReadRegex implements the bsonrw.ValueReader interface.
   473  func (llvrw *ValueReaderWriter) ReadRegex() (pattern string, options string, err error) {
   474  	llvrw.checkdepth()
   475  	llvrw.Invoked = ReadRegex
   476  	if llvrw.ErrAfter == llvrw.Invoked {
   477  		return "", "", llvrw.Err
   478  	}
   479  	switch tt := llvrw.Return.(type) {
   480  	case bsoncore.Value:
   481  		pattern, options, _, ok := bsoncore.ReadRegex(tt.Data)
   482  		if !ok {
   483  			llvrw.T.Error("Invalid Value instance provided for ReadRegex")
   484  			return "", "", nil
   485  		}
   486  		return pattern, options, nil
   487  	default:
   488  		llvrw.T.Errorf("Incorrect type provided for return value of ReadRegex: %T", llvrw.Return)
   489  		return "", "", nil
   490  	}
   491  }
   492  
   493  // ReadString implements the bsonrw.ValueReader interface.
   494  func (llvrw *ValueReaderWriter) ReadString() (string, error) {
   495  	llvrw.checkdepth()
   496  	llvrw.Invoked = ReadString
   497  	if llvrw.ErrAfter == llvrw.Invoked {
   498  		return "", llvrw.Err
   499  	}
   500  	str, ok := llvrw.Return.(string)
   501  	if !ok {
   502  		llvrw.T.Errorf("Incorrect type provided for return value of ReadString: %T", llvrw.Return)
   503  		return "", nil
   504  	}
   505  
   506  	return str, nil
   507  }
   508  
   509  // ReadSymbol implements the bsonrw.ValueReader interface.
   510  func (llvrw *ValueReaderWriter) ReadSymbol() (symbol string, err error) {
   511  	llvrw.checkdepth()
   512  	llvrw.Invoked = ReadSymbol
   513  	if llvrw.ErrAfter == llvrw.Invoked {
   514  		return "", llvrw.Err
   515  	}
   516  	switch tt := llvrw.Return.(type) {
   517  	case string:
   518  		return tt, nil
   519  	case bsoncore.Value:
   520  		symbol, _, ok := bsoncore.ReadSymbol(tt.Data)
   521  		if !ok {
   522  			llvrw.T.Error("Invalid Value instance provided for ReadSymbol")
   523  			return "", nil
   524  		}
   525  		return symbol, nil
   526  	default:
   527  		llvrw.T.Errorf("Incorrect type provided for return value of ReadSymbol: %T", llvrw.Return)
   528  		return "", nil
   529  	}
   530  }
   531  
   532  // ReadTimestamp implements the bsonrw.ValueReader interface.
   533  func (llvrw *ValueReaderWriter) ReadTimestamp() (t uint32, i uint32, err error) {
   534  	llvrw.checkdepth()
   535  	llvrw.Invoked = ReadTimestamp
   536  	if llvrw.ErrAfter == llvrw.Invoked {
   537  		return 0, 0, llvrw.Err
   538  	}
   539  	switch tt := llvrw.Return.(type) {
   540  	case bsoncore.Value:
   541  		t, i, _, ok := bsoncore.ReadTimestamp(tt.Data)
   542  		if !ok {
   543  			llvrw.T.Errorf("Invalid Value instance provided for return value of ReadTimestamp")
   544  			return 0, 0, nil
   545  		}
   546  		return t, i, nil
   547  	default:
   548  		llvrw.T.Errorf("Incorrect type provided for return value of ReadTimestamp: %T", llvrw.Return)
   549  		return 0, 0, nil
   550  	}
   551  }
   552  
   553  // ReadUndefined implements the bsonrw.ValueReader interface.
   554  func (llvrw *ValueReaderWriter) ReadUndefined() error {
   555  	llvrw.checkdepth()
   556  	llvrw.Invoked = ReadUndefined
   557  	if llvrw.ErrAfter == llvrw.Invoked {
   558  		return llvrw.Err
   559  	}
   560  
   561  	return nil
   562  }
   563  
   564  // WriteArray implements the bsonrw.ValueWriter interface.
   565  func (llvrw *ValueReaderWriter) WriteArray() (bsonrw.ArrayWriter, error) {
   566  	llvrw.checkdepth()
   567  	llvrw.Invoked = WriteArray
   568  	if llvrw.ErrAfter == llvrw.Invoked {
   569  		return nil, llvrw.Err
   570  	}
   571  	return llvrw, nil
   572  }
   573  
   574  // WriteBinary implements the bsonrw.ValueWriter interface.
   575  func (llvrw *ValueReaderWriter) WriteBinary([]byte) error {
   576  	llvrw.checkdepth()
   577  	llvrw.Invoked = WriteBinary
   578  	if llvrw.ErrAfter == llvrw.Invoked {
   579  		return llvrw.Err
   580  	}
   581  	return nil
   582  }
   583  
   584  // WriteBinaryWithSubtype implements the bsonrw.ValueWriter interface.
   585  func (llvrw *ValueReaderWriter) WriteBinaryWithSubtype([]byte, byte) error {
   586  	llvrw.checkdepth()
   587  	llvrw.Invoked = WriteBinaryWithSubtype
   588  	if llvrw.ErrAfter == llvrw.Invoked {
   589  		return llvrw.Err
   590  	}
   591  	return nil
   592  }
   593  
   594  // WriteBoolean implements the bsonrw.ValueWriter interface.
   595  func (llvrw *ValueReaderWriter) WriteBoolean(bool) error {
   596  	llvrw.checkdepth()
   597  	llvrw.Invoked = WriteBoolean
   598  	if llvrw.ErrAfter == llvrw.Invoked {
   599  		return llvrw.Err
   600  	}
   601  	return nil
   602  }
   603  
   604  // WriteCodeWithScope implements the bsonrw.ValueWriter interface.
   605  func (llvrw *ValueReaderWriter) WriteCodeWithScope(string) (bsonrw.DocumentWriter, error) {
   606  	llvrw.checkdepth()
   607  	llvrw.Invoked = WriteCodeWithScope
   608  	if llvrw.ErrAfter == llvrw.Invoked {
   609  		return nil, llvrw.Err
   610  	}
   611  	return llvrw, nil
   612  }
   613  
   614  // WriteDBPointer implements the bsonrw.ValueWriter interface.
   615  func (llvrw *ValueReaderWriter) WriteDBPointer(string, primitive.ObjectID) error {
   616  	llvrw.checkdepth()
   617  	llvrw.Invoked = WriteDBPointer
   618  	if llvrw.ErrAfter == llvrw.Invoked {
   619  		return llvrw.Err
   620  	}
   621  	return nil
   622  }
   623  
   624  // WriteDateTime implements the bsonrw.ValueWriter interface.
   625  func (llvrw *ValueReaderWriter) WriteDateTime(int64) error {
   626  	llvrw.checkdepth()
   627  	llvrw.Invoked = WriteDateTime
   628  	if llvrw.ErrAfter == llvrw.Invoked {
   629  		return llvrw.Err
   630  	}
   631  	return nil
   632  }
   633  
   634  // WriteDecimal128 implements the bsonrw.ValueWriter interface.
   635  func (llvrw *ValueReaderWriter) WriteDecimal128(primitive.Decimal128) error {
   636  	llvrw.checkdepth()
   637  	llvrw.Invoked = WriteDecimal128
   638  	if llvrw.ErrAfter == llvrw.Invoked {
   639  		return llvrw.Err
   640  	}
   641  	return nil
   642  }
   643  
   644  // WriteDouble implements the bsonrw.ValueWriter interface.
   645  func (llvrw *ValueReaderWriter) WriteDouble(float64) error {
   646  	llvrw.checkdepth()
   647  	llvrw.Invoked = WriteDouble
   648  	if llvrw.ErrAfter == llvrw.Invoked {
   649  		return llvrw.Err
   650  	}
   651  	return nil
   652  }
   653  
   654  // WriteInt32 implements the bsonrw.ValueWriter interface.
   655  func (llvrw *ValueReaderWriter) WriteInt32(int32) error {
   656  	llvrw.checkdepth()
   657  	llvrw.Invoked = WriteInt32
   658  	if llvrw.ErrAfter == llvrw.Invoked {
   659  		return llvrw.Err
   660  	}
   661  	return nil
   662  }
   663  
   664  // WriteInt64 implements the bsonrw.ValueWriter interface.
   665  func (llvrw *ValueReaderWriter) WriteInt64(int64) error {
   666  	llvrw.checkdepth()
   667  	llvrw.Invoked = WriteInt64
   668  	if llvrw.ErrAfter == llvrw.Invoked {
   669  		return llvrw.Err
   670  	}
   671  	return nil
   672  }
   673  
   674  // WriteJavascript implements the bsonrw.ValueWriter interface.
   675  func (llvrw *ValueReaderWriter) WriteJavascript(string) error {
   676  	llvrw.checkdepth()
   677  	llvrw.Invoked = WriteJavascript
   678  	if llvrw.ErrAfter == llvrw.Invoked {
   679  		return llvrw.Err
   680  	}
   681  	return nil
   682  }
   683  
   684  // WriteMaxKey implements the bsonrw.ValueWriter interface.
   685  func (llvrw *ValueReaderWriter) WriteMaxKey() error {
   686  	llvrw.checkdepth()
   687  	llvrw.Invoked = WriteMaxKey
   688  	if llvrw.ErrAfter == llvrw.Invoked {
   689  		return llvrw.Err
   690  	}
   691  	return nil
   692  }
   693  
   694  // WriteMinKey implements the bsonrw.ValueWriter interface.
   695  func (llvrw *ValueReaderWriter) WriteMinKey() error {
   696  	llvrw.checkdepth()
   697  	llvrw.Invoked = WriteMinKey
   698  	if llvrw.ErrAfter == llvrw.Invoked {
   699  		return llvrw.Err
   700  	}
   701  	return nil
   702  }
   703  
   704  // WriteNull implements the bsonrw.ValueWriter interface.
   705  func (llvrw *ValueReaderWriter) WriteNull() error {
   706  	llvrw.checkdepth()
   707  	llvrw.Invoked = WriteNull
   708  	if llvrw.ErrAfter == llvrw.Invoked {
   709  		return llvrw.Err
   710  	}
   711  	return nil
   712  }
   713  
   714  // WriteObjectID implements the bsonrw.ValueWriter interface.
   715  func (llvrw *ValueReaderWriter) WriteObjectID(primitive.ObjectID) error {
   716  	llvrw.checkdepth()
   717  	llvrw.Invoked = WriteObjectID
   718  	if llvrw.ErrAfter == llvrw.Invoked {
   719  		return llvrw.Err
   720  	}
   721  	return nil
   722  }
   723  
   724  // WriteRegex implements the bsonrw.ValueWriter interface.
   725  func (llvrw *ValueReaderWriter) WriteRegex(string, string) error {
   726  	llvrw.checkdepth()
   727  	llvrw.Invoked = WriteRegex
   728  	if llvrw.ErrAfter == llvrw.Invoked {
   729  		return llvrw.Err
   730  	}
   731  	return nil
   732  }
   733  
   734  // WriteString implements the bsonrw.ValueWriter interface.
   735  func (llvrw *ValueReaderWriter) WriteString(string) error {
   736  	llvrw.checkdepth()
   737  	llvrw.Invoked = WriteString
   738  	if llvrw.ErrAfter == llvrw.Invoked {
   739  		return llvrw.Err
   740  	}
   741  	return nil
   742  }
   743  
   744  // WriteDocument implements the bsonrw.ValueWriter interface.
   745  func (llvrw *ValueReaderWriter) WriteDocument() (bsonrw.DocumentWriter, error) {
   746  	llvrw.checkdepth()
   747  	llvrw.Invoked = WriteDocument
   748  	if llvrw.ErrAfter == llvrw.Invoked {
   749  		return nil, llvrw.Err
   750  	}
   751  	return llvrw, nil
   752  }
   753  
   754  // WriteSymbol implements the bsonrw.ValueWriter interface.
   755  func (llvrw *ValueReaderWriter) WriteSymbol(string) error {
   756  	llvrw.checkdepth()
   757  	llvrw.Invoked = WriteSymbol
   758  	if llvrw.ErrAfter == llvrw.Invoked {
   759  		return llvrw.Err
   760  	}
   761  	return nil
   762  }
   763  
   764  // WriteTimestamp implements the bsonrw.ValueWriter interface.
   765  func (llvrw *ValueReaderWriter) WriteTimestamp(uint32, uint32) error {
   766  	llvrw.checkdepth()
   767  	llvrw.Invoked = WriteTimestamp
   768  	if llvrw.ErrAfter == llvrw.Invoked {
   769  		return llvrw.Err
   770  	}
   771  	return nil
   772  }
   773  
   774  // WriteUndefined implements the bsonrw.ValueWriter interface.
   775  func (llvrw *ValueReaderWriter) WriteUndefined() error {
   776  	llvrw.checkdepth()
   777  	llvrw.Invoked = WriteUndefined
   778  	if llvrw.ErrAfter == llvrw.Invoked {
   779  		return llvrw.Err
   780  	}
   781  	return nil
   782  }
   783  
   784  // ReadElement implements the bsonrw.DocumentReader interface.
   785  func (llvrw *ValueReaderWriter) ReadElement() (string, bsonrw.ValueReader, error) {
   786  	llvrw.checkdepth()
   787  	llvrw.Invoked = ReadElement
   788  	if llvrw.ErrAfter == llvrw.Invoked {
   789  		return "", nil, llvrw.Err
   790  	}
   791  
   792  	return "", llvrw, nil
   793  }
   794  
   795  // WriteDocumentElement implements the bsonrw.DocumentWriter interface.
   796  func (llvrw *ValueReaderWriter) WriteDocumentElement(string) (bsonrw.ValueWriter, error) {
   797  	llvrw.checkdepth()
   798  	llvrw.Invoked = WriteDocumentElement
   799  	if llvrw.ErrAfter == llvrw.Invoked {
   800  		return nil, llvrw.Err
   801  	}
   802  
   803  	return llvrw, nil
   804  }
   805  
   806  // WriteDocumentEnd implements the bsonrw.DocumentWriter interface.
   807  func (llvrw *ValueReaderWriter) WriteDocumentEnd() error {
   808  	llvrw.checkdepth()
   809  	llvrw.Invoked = WriteDocumentEnd
   810  	if llvrw.ErrAfter == llvrw.Invoked {
   811  		return llvrw.Err
   812  	}
   813  
   814  	return nil
   815  }
   816  
   817  // ReadValue implements the bsonrw.ArrayReader interface.
   818  func (llvrw *ValueReaderWriter) ReadValue() (bsonrw.ValueReader, error) {
   819  	llvrw.checkdepth()
   820  	llvrw.Invoked = ReadValue
   821  	if llvrw.ErrAfter == llvrw.Invoked {
   822  		return nil, llvrw.Err
   823  	}
   824  
   825  	return llvrw, nil
   826  }
   827  
   828  // WriteArrayElement implements the bsonrw.ArrayWriter interface.
   829  func (llvrw *ValueReaderWriter) WriteArrayElement() (bsonrw.ValueWriter, error) {
   830  	llvrw.checkdepth()
   831  	llvrw.Invoked = WriteArrayElement
   832  	if llvrw.ErrAfter == llvrw.Invoked {
   833  		return nil, llvrw.Err
   834  	}
   835  
   836  	return llvrw, nil
   837  }
   838  
   839  // WriteArrayEnd implements the bsonrw.ArrayWriter interface.
   840  func (llvrw *ValueReaderWriter) WriteArrayEnd() error {
   841  	llvrw.checkdepth()
   842  	llvrw.Invoked = WriteArrayEnd
   843  	if llvrw.ErrAfter == llvrw.Invoked {
   844  		return llvrw.Err
   845  	}
   846  
   847  	return nil
   848  }
   849  

View as plain text