@@ -187,10 +187,13 @@ func (ejvr *extJSONValueReader) skipArray() error {
187
187
return err
188
188
}
189
189
190
- func (ejvr * extJSONValueReader ) invalidTransitionErr (destination mode ) error {
190
+ func (ejvr * extJSONValueReader ) invalidTransitionErr (destination mode , name string , modes [] mode ) error {
191
191
te := TransitionError {
192
+ name : name ,
192
193
current : ejvr .stack [ejvr .frame ].mode ,
193
194
destination : destination ,
195
+ modes : modes ,
196
+ action : "read" ,
194
197
}
195
198
if ejvr .frame != 0 {
196
199
te .parent = ejvr .stack [ejvr .frame - 1 ].mode
@@ -202,14 +205,18 @@ func (ejvr *extJSONValueReader) typeError(t bsontype.Type) error {
202
205
return fmt .Errorf ("positioned on %s, but attempted to read %s" , ejvr .stack [ejvr .frame ].vType , t )
203
206
}
204
207
205
- func (ejvr * extJSONValueReader ) ensureElementValue (t bsontype.Type , destination mode ) error {
208
+ func (ejvr * extJSONValueReader ) ensureElementValue (t bsontype.Type , destination mode , callerName string , addModes ... mode ) error {
206
209
switch ejvr .stack [ejvr .frame ].mode {
207
210
case mElement , mValue :
208
211
if ejvr .stack [ejvr .frame ].vType != t {
209
212
return ejvr .typeError (t )
210
213
}
211
214
default :
212
- return ejvr .invalidTransitionErr (destination )
215
+ modes := []mode {mElement , mValue }
216
+ if addModes != nil {
217
+ modes = append (modes , addModes ... )
218
+ }
219
+ return ejvr .invalidTransitionErr (destination , callerName , modes )
213
220
}
214
221
215
222
return nil
@@ -223,7 +230,7 @@ func (ejvr *extJSONValueReader) Skip() error {
223
230
switch ejvr .stack [ejvr .frame ].mode {
224
231
case mElement , mValue :
225
232
default :
226
- return ejvr .invalidTransitionErr (0 )
233
+ return ejvr .invalidTransitionErr (0 , "Skip" , [] mode { mElement , mValue } )
227
234
}
228
235
229
236
defer ejvr .pop ()
@@ -270,7 +277,7 @@ func (ejvr *extJSONValueReader) ReadArray() (ArrayReader, error) {
270
277
case mArray :
271
278
return ejvr , nil
272
279
default :
273
- if err := ejvr .ensureElementValue (bsontype .Array , mArray ); err != nil {
280
+ if err := ejvr .ensureElementValue (bsontype .Array , mArray , "ReadArray" , mTopLevel , mArray ); err != nil {
274
281
return nil , err
275
282
}
276
283
}
@@ -281,7 +288,7 @@ func (ejvr *extJSONValueReader) ReadArray() (ArrayReader, error) {
281
288
}
282
289
283
290
func (ejvr * extJSONValueReader ) ReadBinary () (b []byte , btype byte , err error ) {
284
- if err := ejvr .ensureElementValue (bsontype .Binary , 0 ); err != nil {
291
+ if err := ejvr .ensureElementValue (bsontype .Binary , 0 , "ReadBinary" ); err != nil {
285
292
return nil , 0 , err
286
293
}
287
294
@@ -297,7 +304,7 @@ func (ejvr *extJSONValueReader) ReadBinary() (b []byte, btype byte, err error) {
297
304
}
298
305
299
306
func (ejvr * extJSONValueReader ) ReadBoolean () (bool , error ) {
300
- if err := ejvr .ensureElementValue (bsontype .Boolean , 0 ); err != nil {
307
+ if err := ejvr .ensureElementValue (bsontype .Boolean , 0 , "ReadBoolean" ); err != nil {
301
308
return false , err
302
309
}
303
310
@@ -326,12 +333,12 @@ func (ejvr *extJSONValueReader) ReadDocument() (DocumentReader, error) {
326
333
ejvr .pushDocument ()
327
334
return ejvr , nil
328
335
default :
329
- return nil , ejvr .invalidTransitionErr (mDocument )
336
+ return nil , ejvr .invalidTransitionErr (mDocument , "ReadDocument" , [] mode { mTopLevel , mElement , mValue } )
330
337
}
331
338
}
332
339
333
340
func (ejvr * extJSONValueReader ) ReadCodeWithScope () (code string , dr DocumentReader , err error ) {
334
- if err = ejvr .ensureElementValue (bsontype .CodeWithScope , 0 ); err != nil {
341
+ if err = ejvr .ensureElementValue (bsontype .CodeWithScope , 0 , "ReadCodeWithScope" ); err != nil {
335
342
return "" , nil , err
336
343
}
337
344
@@ -347,7 +354,7 @@ func (ejvr *extJSONValueReader) ReadCodeWithScope() (code string, dr DocumentRea
347
354
}
348
355
349
356
func (ejvr * extJSONValueReader ) ReadDBPointer () (ns string , oid objectid.ObjectID , err error ) {
350
- if err = ejvr .ensureElementValue (bsontype .DBPointer , 0 ); err != nil {
357
+ if err = ejvr .ensureElementValue (bsontype .DBPointer , 0 , "ReadDBPointer" ); err != nil {
351
358
return "" , objectid .NilObjectID , err
352
359
}
353
360
@@ -363,7 +370,7 @@ func (ejvr *extJSONValueReader) ReadDBPointer() (ns string, oid objectid.ObjectI
363
370
}
364
371
365
372
func (ejvr * extJSONValueReader ) ReadDateTime () (int64 , error ) {
366
- if err := ejvr .ensureElementValue (bsontype .DateTime , 0 ); err != nil {
373
+ if err := ejvr .ensureElementValue (bsontype .DateTime , 0 , "ReadDateTime" ); err != nil {
367
374
return 0 , err
368
375
}
369
376
@@ -379,7 +386,7 @@ func (ejvr *extJSONValueReader) ReadDateTime() (int64, error) {
379
386
}
380
387
381
388
func (ejvr * extJSONValueReader ) ReadDecimal128 () (decimal.Decimal128 , error ) {
382
- if err := ejvr .ensureElementValue (bsontype .Decimal128 , 0 ); err != nil {
389
+ if err := ejvr .ensureElementValue (bsontype .Decimal128 , 0 , "ReadDecimal128" ); err != nil {
383
390
return decimal.Decimal128 {}, err
384
391
}
385
392
@@ -395,7 +402,7 @@ func (ejvr *extJSONValueReader) ReadDecimal128() (decimal.Decimal128, error) {
395
402
}
396
403
397
404
func (ejvr * extJSONValueReader ) ReadDouble () (float64 , error ) {
398
- if err := ejvr .ensureElementValue (bsontype .Double , 0 ); err != nil {
405
+ if err := ejvr .ensureElementValue (bsontype .Double , 0 , "ReadDouble" ); err != nil {
399
406
return 0 , err
400
407
}
401
408
@@ -411,7 +418,7 @@ func (ejvr *extJSONValueReader) ReadDouble() (float64, error) {
411
418
}
412
419
413
420
func (ejvr * extJSONValueReader ) ReadInt32 () (int32 , error ) {
414
- if err := ejvr .ensureElementValue (bsontype .Int32 , 0 ); err != nil {
421
+ if err := ejvr .ensureElementValue (bsontype .Int32 , 0 , "ReadInt32" ); err != nil {
415
422
return 0 , err
416
423
}
417
424
@@ -427,7 +434,7 @@ func (ejvr *extJSONValueReader) ReadInt32() (int32, error) {
427
434
}
428
435
429
436
func (ejvr * extJSONValueReader ) ReadInt64 () (int64 , error ) {
430
- if err := ejvr .ensureElementValue (bsontype .Int64 , 0 ); err != nil {
437
+ if err := ejvr .ensureElementValue (bsontype .Int64 , 0 , "ReadInt64" ); err != nil {
431
438
return 0 , err
432
439
}
433
440
@@ -443,7 +450,7 @@ func (ejvr *extJSONValueReader) ReadInt64() (int64, error) {
443
450
}
444
451
445
452
func (ejvr * extJSONValueReader ) ReadJavascript () (code string , err error ) {
446
- if err = ejvr .ensureElementValue (bsontype .JavaScript , 0 ); err != nil {
453
+ if err = ejvr .ensureElementValue (bsontype .JavaScript , 0 , "ReadJavascript" ); err != nil {
447
454
return "" , err
448
455
}
449
456
@@ -459,7 +466,7 @@ func (ejvr *extJSONValueReader) ReadJavascript() (code string, err error) {
459
466
}
460
467
461
468
func (ejvr * extJSONValueReader ) ReadMaxKey () error {
462
- if err := ejvr .ensureElementValue (bsontype .MaxKey , 0 ); err != nil {
469
+ if err := ejvr .ensureElementValue (bsontype .MaxKey , 0 , "ReadMaxKey" ); err != nil {
463
470
return err
464
471
}
465
472
@@ -475,7 +482,7 @@ func (ejvr *extJSONValueReader) ReadMaxKey() error {
475
482
}
476
483
477
484
func (ejvr * extJSONValueReader ) ReadMinKey () error {
478
- if err := ejvr .ensureElementValue (bsontype .MinKey , 0 ); err != nil {
485
+ if err := ejvr .ensureElementValue (bsontype .MinKey , 0 , "ReadMinKey" ); err != nil {
479
486
return err
480
487
}
481
488
@@ -491,7 +498,7 @@ func (ejvr *extJSONValueReader) ReadMinKey() error {
491
498
}
492
499
493
500
func (ejvr * extJSONValueReader ) ReadNull () error {
494
- if err := ejvr .ensureElementValue (bsontype .Null , 0 ); err != nil {
501
+ if err := ejvr .ensureElementValue (bsontype .Null , 0 , "ReadNull" ); err != nil {
495
502
return err
496
503
}
497
504
@@ -509,7 +516,7 @@ func (ejvr *extJSONValueReader) ReadNull() error {
509
516
}
510
517
511
518
func (ejvr * extJSONValueReader ) ReadObjectID () (objectid.ObjectID , error ) {
512
- if err := ejvr .ensureElementValue (bsontype .ObjectID , 0 ); err != nil {
519
+ if err := ejvr .ensureElementValue (bsontype .ObjectID , 0 , "ReadObjectID" ); err != nil {
513
520
return objectid.ObjectID {}, err
514
521
}
515
522
@@ -525,7 +532,7 @@ func (ejvr *extJSONValueReader) ReadObjectID() (objectid.ObjectID, error) {
525
532
}
526
533
527
534
func (ejvr * extJSONValueReader ) ReadRegex () (pattern string , options string , err error ) {
528
- if err = ejvr .ensureElementValue (bsontype .Regex , 0 ); err != nil {
535
+ if err = ejvr .ensureElementValue (bsontype .Regex , 0 , "ReadRegex" ); err != nil {
529
536
return "" , "" , err
530
537
}
531
538
@@ -541,7 +548,7 @@ func (ejvr *extJSONValueReader) ReadRegex() (pattern string, options string, err
541
548
}
542
549
543
550
func (ejvr * extJSONValueReader ) ReadString () (string , error ) {
544
- if err := ejvr .ensureElementValue (bsontype .String , 0 ); err != nil {
551
+ if err := ejvr .ensureElementValue (bsontype .String , 0 , "ReadString" ); err != nil {
545
552
return "" , err
546
553
}
547
554
@@ -559,7 +566,7 @@ func (ejvr *extJSONValueReader) ReadString() (string, error) {
559
566
}
560
567
561
568
func (ejvr * extJSONValueReader ) ReadSymbol () (symbol string , err error ) {
562
- if err = ejvr .ensureElementValue (bsontype .Symbol , 0 ); err != nil {
569
+ if err = ejvr .ensureElementValue (bsontype .Symbol , 0 , "ReadSymbol" ); err != nil {
563
570
return "" , err
564
571
}
565
572
@@ -575,7 +582,7 @@ func (ejvr *extJSONValueReader) ReadSymbol() (symbol string, err error) {
575
582
}
576
583
577
584
func (ejvr * extJSONValueReader ) ReadTimestamp () (t uint32 , i uint32 , err error ) {
578
- if err = ejvr .ensureElementValue (bsontype .Timestamp , 0 ); err != nil {
585
+ if err = ejvr .ensureElementValue (bsontype .Timestamp , 0 , "ReadTimestamp" ); err != nil {
579
586
return 0 , 0 , err
580
587
}
581
588
@@ -591,7 +598,7 @@ func (ejvr *extJSONValueReader) ReadTimestamp() (t uint32, i uint32, err error)
591
598
}
592
599
593
600
func (ejvr * extJSONValueReader ) ReadUndefined () error {
594
- if err := ejvr .ensureElementValue (bsontype .Undefined , 0 ); err != nil {
601
+ if err := ejvr .ensureElementValue (bsontype .Undefined , 0 , "ReadUndefined" ); err != nil {
595
602
return err
596
603
}
597
604
@@ -610,7 +617,7 @@ func (ejvr *extJSONValueReader) ReadElement() (string, ValueReader, error) {
610
617
switch ejvr .stack [ejvr .frame ].mode {
611
618
case mTopLevel , mDocument , mCodeWithScope :
612
619
default :
613
- return "" , nil , ejvr .invalidTransitionErr (mElement )
620
+ return "" , nil , ejvr .invalidTransitionErr (mElement , "ReadElement" , [] mode { mTopLevel , mDocument , mCodeWithScope } )
614
621
}
615
622
616
623
name , t , err := ejvr .p .readKey ()
@@ -638,7 +645,7 @@ func (ejvr *extJSONValueReader) ReadValue() (ValueReader, error) {
638
645
switch ejvr .stack [ejvr .frame ].mode {
639
646
case mArray :
640
647
default :
641
- return nil , ejvr .invalidTransitionErr (mValue )
648
+ return nil , ejvr .invalidTransitionErr (mValue , "ReadValue" , [] mode { mArray } )
642
649
}
643
650
644
651
t , err := ejvr .p .peekType ()
0 commit comments