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