1
2
3
4
5
6
7
8 package 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
23 type Invoked byte
24
25
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
188 type ValueReaderWriter struct {
189 T *testing.T
190 Invoked Invoked
191 Return interface{}
192 BSONType bsontype.Type
193 Err error
194 ErrAfter Invoked
195 depth uint64
196 }
197
198
199 func (llvrw *ValueReaderWriter) checkdepth() {
200 llvrw.depth++
201 if llvrw.depth > 1000 {
202 panic("max depth exceeded")
203 }
204 }
205
206
207 func (llvrw *ValueReaderWriter) Type() bsontype.Type {
208 llvrw.checkdepth()
209 return llvrw.BSONType
210 }
211
212
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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