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