podman
278 строк · 4.7 Кб
1package jsoniter
2
3import (
4"reflect"
5"unsafe"
6)
7
8type arrayLazyAny struct {
9baseAny
10cfg *frozenConfig
11buf []byte
12err error
13}
14
15func (any *arrayLazyAny) ValueType() ValueType {
16return ArrayValue
17}
18
19func (any *arrayLazyAny) MustBeValid() Any {
20return any
21}
22
23func (any *arrayLazyAny) LastError() error {
24return any.err
25}
26
27func (any *arrayLazyAny) ToBool() bool {
28iter := any.cfg.BorrowIterator(any.buf)
29defer any.cfg.ReturnIterator(iter)
30return iter.ReadArray()
31}
32
33func (any *arrayLazyAny) ToInt() int {
34if any.ToBool() {
35return 1
36}
37return 0
38}
39
40func (any *arrayLazyAny) ToInt32() int32 {
41if any.ToBool() {
42return 1
43}
44return 0
45}
46
47func (any *arrayLazyAny) ToInt64() int64 {
48if any.ToBool() {
49return 1
50}
51return 0
52}
53
54func (any *arrayLazyAny) ToUint() uint {
55if any.ToBool() {
56return 1
57}
58return 0
59}
60
61func (any *arrayLazyAny) ToUint32() uint32 {
62if any.ToBool() {
63return 1
64}
65return 0
66}
67
68func (any *arrayLazyAny) ToUint64() uint64 {
69if any.ToBool() {
70return 1
71}
72return 0
73}
74
75func (any *arrayLazyAny) ToFloat32() float32 {
76if any.ToBool() {
77return 1
78}
79return 0
80}
81
82func (any *arrayLazyAny) ToFloat64() float64 {
83if any.ToBool() {
84return 1
85}
86return 0
87}
88
89func (any *arrayLazyAny) ToString() string {
90return *(*string)(unsafe.Pointer(&any.buf))
91}
92
93func (any *arrayLazyAny) ToVal(val interface{}) {
94iter := any.cfg.BorrowIterator(any.buf)
95defer any.cfg.ReturnIterator(iter)
96iter.ReadVal(val)
97}
98
99func (any *arrayLazyAny) Get(path ...interface{}) Any {
100if len(path) == 0 {
101return any
102}
103switch firstPath := path[0].(type) {
104case int:
105iter := any.cfg.BorrowIterator(any.buf)
106defer any.cfg.ReturnIterator(iter)
107valueBytes := locateArrayElement(iter, firstPath)
108if valueBytes == nil {
109return newInvalidAny(path)
110}
111iter.ResetBytes(valueBytes)
112return locatePath(iter, path[1:])
113case int32:
114if '*' == firstPath {
115iter := any.cfg.BorrowIterator(any.buf)
116defer any.cfg.ReturnIterator(iter)
117arr := make([]Any, 0)
118iter.ReadArrayCB(func(iter *Iterator) bool {
119found := iter.readAny().Get(path[1:]...)
120if found.ValueType() != InvalidValue {
121arr = append(arr, found)
122}
123return true
124})
125return wrapArray(arr)
126}
127return newInvalidAny(path)
128default:
129return newInvalidAny(path)
130}
131}
132
133func (any *arrayLazyAny) Size() int {
134size := 0
135iter := any.cfg.BorrowIterator(any.buf)
136defer any.cfg.ReturnIterator(iter)
137iter.ReadArrayCB(func(iter *Iterator) bool {
138size++
139iter.Skip()
140return true
141})
142return size
143}
144
145func (any *arrayLazyAny) WriteTo(stream *Stream) {
146stream.Write(any.buf)
147}
148
149func (any *arrayLazyAny) GetInterface() interface{} {
150iter := any.cfg.BorrowIterator(any.buf)
151defer any.cfg.ReturnIterator(iter)
152return iter.Read()
153}
154
155type arrayAny struct {
156baseAny
157val reflect.Value
158}
159
160func wrapArray(val interface{}) *arrayAny {
161return &arrayAny{baseAny{}, reflect.ValueOf(val)}
162}
163
164func (any *arrayAny) ValueType() ValueType {
165return ArrayValue
166}
167
168func (any *arrayAny) MustBeValid() Any {
169return any
170}
171
172func (any *arrayAny) LastError() error {
173return nil
174}
175
176func (any *arrayAny) ToBool() bool {
177return any.val.Len() != 0
178}
179
180func (any *arrayAny) ToInt() int {
181if any.val.Len() == 0 {
182return 0
183}
184return 1
185}
186
187func (any *arrayAny) ToInt32() int32 {
188if any.val.Len() == 0 {
189return 0
190}
191return 1
192}
193
194func (any *arrayAny) ToInt64() int64 {
195if any.val.Len() == 0 {
196return 0
197}
198return 1
199}
200
201func (any *arrayAny) ToUint() uint {
202if any.val.Len() == 0 {
203return 0
204}
205return 1
206}
207
208func (any *arrayAny) ToUint32() uint32 {
209if any.val.Len() == 0 {
210return 0
211}
212return 1
213}
214
215func (any *arrayAny) ToUint64() uint64 {
216if any.val.Len() == 0 {
217return 0
218}
219return 1
220}
221
222func (any *arrayAny) ToFloat32() float32 {
223if any.val.Len() == 0 {
224return 0
225}
226return 1
227}
228
229func (any *arrayAny) ToFloat64() float64 {
230if any.val.Len() == 0 {
231return 0
232}
233return 1
234}
235
236func (any *arrayAny) ToString() string {
237str, _ := MarshalToString(any.val.Interface())
238return str
239}
240
241func (any *arrayAny) Get(path ...interface{}) Any {
242if len(path) == 0 {
243return any
244}
245switch firstPath := path[0].(type) {
246case int:
247if firstPath < 0 || firstPath >= any.val.Len() {
248return newInvalidAny(path)
249}
250return Wrap(any.val.Index(firstPath).Interface())
251case int32:
252if '*' == firstPath {
253mappedAll := make([]Any, 0)
254for i := 0; i < any.val.Len(); i++ {
255mapped := Wrap(any.val.Index(i).Interface()).Get(path[1:]...)
256if mapped.ValueType() != InvalidValue {
257mappedAll = append(mappedAll, mapped)
258}
259}
260return wrapArray(mappedAll)
261}
262return newInvalidAny(path)
263default:
264return newInvalidAny(path)
265}
266}
267
268func (any *arrayAny) Size() int {
269return any.val.Len()
270}
271
272func (any *arrayAny) WriteTo(stream *Stream) {
273stream.WriteVal(any.val)
274}
275
276func (any *arrayAny) GetInterface() interface{} {
277return any.val.Interface()
278}
279