Code refactoring for bpa operator
[icn.git] / cmd / bpa-operator / vendor / github.com / json-iterator / go / any_object.go
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 }