1
16
17 package jsonpath
18
19 import "fmt"
20
21
22 type NodeType int
23
24
25 func (t NodeType) Type() NodeType {
26 return t
27 }
28
29 func (t NodeType) String() string {
30 return NodeTypeName[t]
31 }
32
33 const (
34 NodeText NodeType = iota
35 NodeArray
36 NodeList
37 NodeField
38 NodeIdentifier
39 NodeFilter
40 NodeInt
41 NodeFloat
42 NodeWildcard
43 NodeRecursive
44 NodeUnion
45 NodeBool
46 )
47
48 var NodeTypeName = map[NodeType]string{
49 NodeText: "NodeText",
50 NodeArray: "NodeArray",
51 NodeList: "NodeList",
52 NodeField: "NodeField",
53 NodeIdentifier: "NodeIdentifier",
54 NodeFilter: "NodeFilter",
55 NodeInt: "NodeInt",
56 NodeFloat: "NodeFloat",
57 NodeWildcard: "NodeWildcard",
58 NodeRecursive: "NodeRecursive",
59 NodeUnion: "NodeUnion",
60 NodeBool: "NodeBool",
61 }
62
63 type Node interface {
64 Type() NodeType
65 String() string
66 }
67
68
69 type ListNode struct {
70 NodeType
71 Nodes []Node
72 }
73
74 func newList() *ListNode {
75 return &ListNode{NodeType: NodeList}
76 }
77
78 func (l *ListNode) append(n Node) {
79 l.Nodes = append(l.Nodes, n)
80 }
81
82 func (l *ListNode) String() string {
83 return l.Type().String()
84 }
85
86
87 type TextNode struct {
88 NodeType
89 Text string
90 }
91
92 func newText(text string) *TextNode {
93 return &TextNode{NodeType: NodeText, Text: text}
94 }
95
96 func (t *TextNode) String() string {
97 return fmt.Sprintf("%s: %s", t.Type(), t.Text)
98 }
99
100
101 type FieldNode struct {
102 NodeType
103 Value string
104 }
105
106 func newField(value string) *FieldNode {
107 return &FieldNode{NodeType: NodeField, Value: value}
108 }
109
110 func (f *FieldNode) String() string {
111 return fmt.Sprintf("%s: %s", f.Type(), f.Value)
112 }
113
114
115 type IdentifierNode struct {
116 NodeType
117 Name string
118 }
119
120 func newIdentifier(value string) *IdentifierNode {
121 return &IdentifierNode{
122 NodeType: NodeIdentifier,
123 Name: value,
124 }
125 }
126
127 func (f *IdentifierNode) String() string {
128 return fmt.Sprintf("%s: %s", f.Type(), f.Name)
129 }
130
131
132 type ParamsEntry struct {
133 Value int
134 Known bool
135 Derived bool
136 }
137
138
139 type ArrayNode struct {
140 NodeType
141 Params [3]ParamsEntry
142 }
143
144 func newArray(params [3]ParamsEntry) *ArrayNode {
145 return &ArrayNode{
146 NodeType: NodeArray,
147 Params: params,
148 }
149 }
150
151 func (a *ArrayNode) String() string {
152 return fmt.Sprintf("%s: %v", a.Type(), a.Params)
153 }
154
155
156 type FilterNode struct {
157 NodeType
158 Left *ListNode
159 Right *ListNode
160 Operator string
161 }
162
163 func newFilter(left, right *ListNode, operator string) *FilterNode {
164 return &FilterNode{
165 NodeType: NodeFilter,
166 Left: left,
167 Right: right,
168 Operator: operator,
169 }
170 }
171
172 func (f *FilterNode) String() string {
173 return fmt.Sprintf("%s: %s %s %s", f.Type(), f.Left, f.Operator, f.Right)
174 }
175
176
177 type IntNode struct {
178 NodeType
179 Value int
180 }
181
182 func newInt(num int) *IntNode {
183 return &IntNode{NodeType: NodeInt, Value: num}
184 }
185
186 func (i *IntNode) String() string {
187 return fmt.Sprintf("%s: %d", i.Type(), i.Value)
188 }
189
190
191 type FloatNode struct {
192 NodeType
193 Value float64
194 }
195
196 func newFloat(num float64) *FloatNode {
197 return &FloatNode{NodeType: NodeFloat, Value: num}
198 }
199
200 func (i *FloatNode) String() string {
201 return fmt.Sprintf("%s: %f", i.Type(), i.Value)
202 }
203
204
205 type WildcardNode struct {
206 NodeType
207 }
208
209 func newWildcard() *WildcardNode {
210 return &WildcardNode{NodeType: NodeWildcard}
211 }
212
213 func (i *WildcardNode) String() string {
214 return i.Type().String()
215 }
216
217
218 type RecursiveNode struct {
219 NodeType
220 }
221
222 func newRecursive() *RecursiveNode {
223 return &RecursiveNode{NodeType: NodeRecursive}
224 }
225
226 func (r *RecursiveNode) String() string {
227 return r.Type().String()
228 }
229
230
231 type UnionNode struct {
232 NodeType
233 Nodes []*ListNode
234 }
235
236 func newUnion(nodes []*ListNode) *UnionNode {
237 return &UnionNode{NodeType: NodeUnion, Nodes: nodes}
238 }
239
240 func (u *UnionNode) String() string {
241 return u.Type().String()
242 }
243
244
245 type BoolNode struct {
246 NodeType
247 Value bool
248 }
249
250 func newBool(value bool) *BoolNode {
251 return &BoolNode{NodeType: NodeBool, Value: value}
252 }
253
254 func (b *BoolNode) String() string {
255 return fmt.Sprintf("%s: %t", b.Type(), b.Value)
256 }
257
View as plain text