diff options
Diffstat (limited to 'vendor/github.com/json-iterator/go/any_object.go')
-rw-r--r-- | vendor/github.com/json-iterator/go/any_object.go | 374 |
1 files changed, 374 insertions, 0 deletions
diff --git a/vendor/github.com/json-iterator/go/any_object.go b/vendor/github.com/json-iterator/go/any_object.go new file mode 100644 index 0000000..c44ef5c --- /dev/null +++ b/vendor/github.com/json-iterator/go/any_object.go | |||
@@ -0,0 +1,374 @@ | |||
1 | package jsoniter | ||
2 | |||
3 | import ( | ||
4 | "reflect" | ||
5 | "unsafe" | ||
6 | ) | ||
7 | |||
8 | type objectLazyAny struct { | ||
9 | baseAny | ||
10 | cfg *frozenConfig | ||
11 | buf []byte | ||
12 | err error | ||
13 | } | ||
14 | |||
15 | func (any *objectLazyAny) ValueType() ValueType { | ||
16 | return ObjectValue | ||
17 | } | ||
18 | |||
19 | func (any *objectLazyAny) MustBeValid() Any { | ||
20 | return any | ||
21 | } | ||
22 | |||
23 | func (any *objectLazyAny) LastError() error { | ||
24 | return any.err | ||
25 | } | ||
26 | |||
27 | func (any *objectLazyAny) ToBool() bool { | ||
28 | return true | ||
29 | } | ||
30 | |||
31 | func (any *objectLazyAny) ToInt() int { | ||
32 | return 0 | ||
33 | } | ||
34 | |||
35 | func (any *objectLazyAny) ToInt32() int32 { | ||
36 | return 0 | ||
37 | } | ||
38 | |||
39 | func (any *objectLazyAny) ToInt64() int64 { | ||
40 | return 0 | ||
41 | } | ||
42 | |||
43 | func (any *objectLazyAny) ToUint() uint { | ||
44 | return 0 | ||
45 | } | ||
46 | |||
47 | func (any *objectLazyAny) ToUint32() uint32 { | ||
48 | return 0 | ||
49 | } | ||
50 | |||
51 | func (any *objectLazyAny) ToUint64() uint64 { | ||
52 | return 0 | ||
53 | } | ||
54 | |||
55 | func (any *objectLazyAny) ToFloat32() float32 { | ||
56 | return 0 | ||
57 | } | ||
58 | |||
59 | func (any *objectLazyAny) ToFloat64() float64 { | ||
60 | return 0 | ||
61 | } | ||
62 | |||
63 | func (any *objectLazyAny) ToString() string { | ||
64 | return *(*string)(unsafe.Pointer(&any.buf)) | ||
65 | } | ||
66 | |||
67 | func (any *objectLazyAny) ToVal(obj interface{}) { | ||
68 | iter := any.cfg.BorrowIterator(any.buf) | ||
69 | defer any.cfg.ReturnIterator(iter) | ||
70 | iter.ReadVal(obj) | ||
71 | } | ||
72 | |||
73 | func (any *objectLazyAny) Get(path ...interface{}) Any { | ||
74 | if len(path) == 0 { | ||
75 | return any | ||
76 | } | ||
77 | switch firstPath := path[0].(type) { | ||
78 | case string: | ||
79 | iter := any.cfg.BorrowIterator(any.buf) | ||
80 | defer any.cfg.ReturnIterator(iter) | ||
81 | valueBytes := locateObjectField(iter, firstPath) | ||
82 | if valueBytes == nil { | ||
83 | return newInvalidAny(path) | ||
84 | } | ||
85 | iter.ResetBytes(valueBytes) | ||
86 | return locatePath(iter, path[1:]) | ||
87 | case int32: | ||
88 | if '*' == firstPath { | ||
89 | mappedAll := map[string]Any{} | ||
90 | iter := any.cfg.BorrowIterator(any.buf) | ||
91 | defer any.cfg.ReturnIterator(iter) | ||
92 | iter.ReadMapCB(func(iter *Iterator, field string) bool { | ||
93 | mapped := locatePath(iter, path[1:]) | ||
94 | if mapped.ValueType() != InvalidValue { | ||
95 | mappedAll[field] = mapped | ||
96 | } | ||
97 | return true | ||
98 | }) | ||
99 | return wrapMap(mappedAll) | ||
100 | } | ||
101 | return newInvalidAny(path) | ||
102 | default: | ||
103 | return newInvalidAny(path) | ||
104 | } | ||
105 | } | ||
106 | |||
107 | func (any *objectLazyAny) Keys() []string { | ||
108 | keys := []string{} | ||
109 | iter := any.cfg.BorrowIterator(any.buf) | ||
110 | defer any.cfg.ReturnIterator(iter) | ||
111 | iter.ReadMapCB(func(iter *Iterator, field string) bool { | ||
112 | iter.Skip() | ||
113 | keys = append(keys, field) | ||
114 | return true | ||
115 | }) | ||
116 | return keys | ||
117 | } | ||
118 | |||
119 | func (any *objectLazyAny) Size() int { | ||
120 | size := 0 | ||
121 | iter := any.cfg.BorrowIterator(any.buf) | ||
122 | defer any.cfg.ReturnIterator(iter) | ||
123 | iter.ReadObjectCB(func(iter *Iterator, field string) bool { | ||
124 | iter.Skip() | ||
125 | size++ | ||
126 | return true | ||
127 | }) | ||
128 | return size | ||
129 | } | ||
130 | |||
131 | func (any *objectLazyAny) WriteTo(stream *Stream) { | ||
132 | stream.Write(any.buf) | ||
133 | } | ||
134 | |||
135 | func (any *objectLazyAny) GetInterface() interface{} { | ||
136 | iter := any.cfg.BorrowIterator(any.buf) | ||
137 | defer any.cfg.ReturnIterator(iter) | ||
138 | return iter.Read() | ||
139 | } | ||
140 | |||
141 | type objectAny struct { | ||
142 | baseAny | ||
143 | err error | ||
144 | val reflect.Value | ||
145 | } | ||
146 | |||
147 | func wrapStruct(val interface{}) *objectAny { | ||
148 | return &objectAny{baseAny{}, nil, reflect.ValueOf(val)} | ||
149 | } | ||
150 | |||
151 | func (any *objectAny) ValueType() ValueType { | ||
152 | return ObjectValue | ||
153 | } | ||
154 | |||
155 | func (any *objectAny) MustBeValid() Any { | ||
156 | return any | ||
157 | } | ||
158 | |||
159 | func (any *objectAny) Parse() *Iterator { | ||
160 | return nil | ||
161 | } | ||
162 | |||
163 | func (any *objectAny) LastError() error { | ||
164 | return any.err | ||
165 | } | ||
166 | |||
167 | func (any *objectAny) ToBool() bool { | ||
168 | return any.val.NumField() != 0 | ||
169 | } | ||
170 | |||
171 | func (any *objectAny) ToInt() int { | ||
172 | return 0 | ||
173 | } | ||
174 | |||
175 | func (any *objectAny) ToInt32() int32 { | ||
176 | return 0 | ||
177 | } | ||
178 | |||
179 | func (any *objectAny) ToInt64() int64 { | ||
180 | return 0 | ||
181 | } | ||
182 | |||
183 | func (any *objectAny) ToUint() uint { | ||
184 | return 0 | ||
185 | } | ||
186 | |||
187 | func (any *objectAny) ToUint32() uint32 { | ||
188 | return 0 | ||
189 | } | ||
190 | |||
191 | func (any *objectAny) ToUint64() uint64 { | ||
192 | return 0 | ||
193 | } | ||
194 | |||
195 | func (any *objectAny) ToFloat32() float32 { | ||
196 | return 0 | ||
197 | } | ||
198 | |||
199 | func (any *objectAny) ToFloat64() float64 { | ||
200 | return 0 | ||
201 | } | ||
202 | |||
203 | func (any *objectAny) ToString() string { | ||
204 | str, err := MarshalToString(any.val.Interface()) | ||
205 | any.err = err | ||
206 | return str | ||
207 | } | ||
208 | |||
209 | func (any *objectAny) Get(path ...interface{}) Any { | ||
210 | if len(path) == 0 { | ||
211 | return any | ||
212 | } | ||
213 | switch firstPath := path[0].(type) { | ||
214 | case string: | ||
215 | field := any.val.FieldByName(firstPath) | ||
216 | if !field.IsValid() { | ||
217 | return newInvalidAny(path) | ||
218 | } | ||
219 | return Wrap(field.Interface()) | ||
220 | case int32: | ||
221 | if '*' == firstPath { | ||
222 | mappedAll := map[string]Any{} | ||
223 | for i := 0; i < any.val.NumField(); i++ { | ||
224 | field := any.val.Field(i) | ||
225 | if field.CanInterface() { | ||
226 | mapped := Wrap(field.Interface()).Get(path[1:]...) | ||
227 | if mapped.ValueType() != InvalidValue { | ||
228 | mappedAll[any.val.Type().Field(i).Name] = mapped | ||
229 | } | ||
230 | } | ||
231 | } | ||
232 | return wrapMap(mappedAll) | ||
233 | } | ||
234 | return newInvalidAny(path) | ||
235 | default: | ||
236 | return newInvalidAny(path) | ||
237 | } | ||
238 | } | ||
239 | |||
240 | func (any *objectAny) Keys() []string { | ||
241 | keys := make([]string, 0, any.val.NumField()) | ||
242 | for i := 0; i < any.val.NumField(); i++ { | ||
243 | keys = append(keys, any.val.Type().Field(i).Name) | ||
244 | } | ||
245 | return keys | ||
246 | } | ||
247 | |||
248 | func (any *objectAny) Size() int { | ||
249 | return any.val.NumField() | ||
250 | } | ||
251 | |||
252 | func (any *objectAny) WriteTo(stream *Stream) { | ||
253 | stream.WriteVal(any.val) | ||
254 | } | ||
255 | |||
256 | func (any *objectAny) GetInterface() interface{} { | ||
257 | return any.val.Interface() | ||
258 | } | ||
259 | |||
260 | type mapAny struct { | ||
261 | baseAny | ||
262 | err error | ||
263 | val reflect.Value | ||
264 | } | ||
265 | |||
266 | func wrapMap(val interface{}) *mapAny { | ||
267 | return &mapAny{baseAny{}, nil, reflect.ValueOf(val)} | ||
268 | } | ||
269 | |||
270 | func (any *mapAny) ValueType() ValueType { | ||
271 | return ObjectValue | ||
272 | } | ||
273 | |||
274 | func (any *mapAny) MustBeValid() Any { | ||
275 | return any | ||
276 | } | ||
277 | |||
278 | func (any *mapAny) Parse() *Iterator { | ||
279 | return nil | ||
280 | } | ||
281 | |||
282 | func (any *mapAny) LastError() error { | ||
283 | return any.err | ||
284 | } | ||
285 | |||
286 | func (any *mapAny) ToBool() bool { | ||
287 | return true | ||
288 | } | ||
289 | |||
290 | func (any *mapAny) ToInt() int { | ||
291 | return 0 | ||
292 | } | ||
293 | |||
294 | func (any *mapAny) ToInt32() int32 { | ||
295 | return 0 | ||
296 | } | ||
297 | |||
298 | func (any *mapAny) ToInt64() int64 { | ||
299 | return 0 | ||
300 | } | ||
301 | |||
302 | func (any *mapAny) ToUint() uint { | ||
303 | return 0 | ||
304 | } | ||
305 | |||
306 | func (any *mapAny) ToUint32() uint32 { | ||
307 | return 0 | ||
308 | } | ||
309 | |||
310 | func (any *mapAny) ToUint64() uint64 { | ||
311 | return 0 | ||
312 | } | ||
313 | |||
314 | func (any *mapAny) ToFloat32() float32 { | ||
315 | return 0 | ||
316 | } | ||
317 | |||
318 | func (any *mapAny) ToFloat64() float64 { | ||
319 | return 0 | ||
320 | } | ||
321 | |||
322 | func (any *mapAny) ToString() string { | ||
323 | str, err := MarshalToString(any.val.Interface()) | ||
324 | any.err = err | ||
325 | return str | ||
326 | } | ||
327 | |||
328 | func (any *mapAny) Get(path ...interface{}) Any { | ||
329 | if len(path) == 0 { | ||
330 | return any | ||
331 | } | ||
332 | switch firstPath := path[0].(type) { | ||
333 | case int32: | ||
334 | if '*' == firstPath { | ||
335 | mappedAll := map[string]Any{} | ||
336 | for _, key := range any.val.MapKeys() { | ||
337 | keyAsStr := key.String() | ||
338 | element := Wrap(any.val.MapIndex(key).Interface()) | ||
339 | mapped := element.Get(path[1:]...) | ||
340 | if mapped.ValueType() != InvalidValue { | ||
341 | mappedAll[keyAsStr] = mapped | ||
342 | } | ||
343 | } | ||
344 | return wrapMap(mappedAll) | ||
345 | } | ||
346 | return newInvalidAny(path) | ||
347 | default: | ||
348 | value := any.val.MapIndex(reflect.ValueOf(firstPath)) | ||
349 | if !value.IsValid() { | ||
350 | return newInvalidAny(path) | ||
351 | } | ||
352 | return Wrap(value.Interface()) | ||
353 | } | ||
354 | } | ||
355 | |||
356 | func (any *mapAny) Keys() []string { | ||
357 | keys := make([]string, 0, any.val.Len()) | ||
358 | for _, key := range any.val.MapKeys() { | ||
359 | keys = append(keys, key.String()) | ||
360 | } | ||
361 | return keys | ||
362 | } | ||
363 | |||
364 | func (any *mapAny) Size() int { | ||
365 | return any.val.Len() | ||
366 | } | ||
367 | |||
368 | func (any *mapAny) WriteTo(stream *Stream) { | ||
369 | stream.WriteVal(any.val) | ||
370 | } | ||
371 | |||
372 | func (any *mapAny) GetInterface() interface{} { | ||
373 | return any.val.Interface() | ||
374 | } | ||