podman

Форк
0
374 строки · 6.8 Кб
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
}
375

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.