...
1
2
3
4
5
6
7 package bsonrw
8
9 import (
10 "fmt"
11 )
12
13 type mode int
14
15 const (
16 _ mode = iota
17 mTopLevel
18 mDocument
19 mArray
20 mValue
21 mElement
22 mCodeWithScope
23 mSpacer
24 )
25
26 func (m mode) String() string {
27 var str string
28
29 switch m {
30 case mTopLevel:
31 str = "TopLevel"
32 case mDocument:
33 str = "DocumentMode"
34 case mArray:
35 str = "ArrayMode"
36 case mValue:
37 str = "ValueMode"
38 case mElement:
39 str = "ElementMode"
40 case mCodeWithScope:
41 str = "CodeWithScopeMode"
42 case mSpacer:
43 str = "CodeWithScopeSpacerFrame"
44 default:
45 str = "UnknownMode"
46 }
47
48 return str
49 }
50
51 func (m mode) TypeString() string {
52 var str string
53
54 switch m {
55 case mTopLevel:
56 str = "TopLevel"
57 case mDocument:
58 str = "Document"
59 case mArray:
60 str = "Array"
61 case mValue:
62 str = "Value"
63 case mElement:
64 str = "Element"
65 case mCodeWithScope:
66 str = "CodeWithScope"
67 case mSpacer:
68 str = "CodeWithScopeSpacer"
69 default:
70 str = "Unknown"
71 }
72
73 return str
74 }
75
76
77
78
79 type TransitionError struct {
80 name string
81 parent mode
82 current mode
83 destination mode
84 modes []mode
85 action string
86 }
87
88 func (te TransitionError) Error() string {
89 errString := fmt.Sprintf("%s can only %s", te.name, te.action)
90 if te.destination != mode(0) {
91 errString = fmt.Sprintf("%s a %s", errString, te.destination.TypeString())
92 }
93 errString = fmt.Sprintf("%s while positioned on a", errString)
94 for ind, m := range te.modes {
95 if ind != 0 && len(te.modes) > 2 {
96 errString = fmt.Sprintf("%s,", errString)
97 }
98 if ind == len(te.modes)-1 && len(te.modes) > 1 {
99 errString = fmt.Sprintf("%s or", errString)
100 }
101 errString = fmt.Sprintf("%s %s", errString, m.TypeString())
102 }
103 errString = fmt.Sprintf("%s but is positioned on a %s", errString, te.current.TypeString())
104 if te.parent != mode(0) {
105 errString = fmt.Sprintf("%s with parent %s", errString, te.parent.TypeString())
106 }
107 return errString
108 }
109
View as plain text