podman
374 строки · 6.8 Кб
1package jsoniter2
3import (4"reflect"5"unsafe"6)
7
8type objectLazyAny struct {9baseAny
10cfg *frozenConfig11buf []byte12err error13}
14
15func (any *objectLazyAny) ValueType() ValueType {16return ObjectValue17}
18
19func (any *objectLazyAny) MustBeValid() Any {20return any21}
22
23func (any *objectLazyAny) LastError() error {24return any.err25}
26
27func (any *objectLazyAny) ToBool() bool {28return true29}
30
31func (any *objectLazyAny) ToInt() int {32return 033}
34
35func (any *objectLazyAny) ToInt32() int32 {36return 037}
38
39func (any *objectLazyAny) ToInt64() int64 {40return 041}
42
43func (any *objectLazyAny) ToUint() uint {44return 045}
46
47func (any *objectLazyAny) ToUint32() uint32 {48return 049}
50
51func (any *objectLazyAny) ToUint64() uint64 {52return 053}
54
55func (any *objectLazyAny) ToFloat32() float32 {56return 057}
58
59func (any *objectLazyAny) ToFloat64() float64 {60return 061}
62
63func (any *objectLazyAny) ToString() string {64return *(*string)(unsafe.Pointer(&any.buf))65}
66
67func (any *objectLazyAny) ToVal(obj interface{}) {68iter := any.cfg.BorrowIterator(any.buf)69defer any.cfg.ReturnIterator(iter)70iter.ReadVal(obj)71}
72
73func (any *objectLazyAny) Get(path ...interface{}) Any {74if len(path) == 0 {75return any76}77switch firstPath := path[0].(type) {78case string:79iter := any.cfg.BorrowIterator(any.buf)80defer any.cfg.ReturnIterator(iter)81valueBytes := locateObjectField(iter, firstPath)82if valueBytes == nil {83return newInvalidAny(path)84}85iter.ResetBytes(valueBytes)86return locatePath(iter, path[1:])87case int32:88if '*' == firstPath {89mappedAll := map[string]Any{}90iter := any.cfg.BorrowIterator(any.buf)91defer any.cfg.ReturnIterator(iter)92iter.ReadMapCB(func(iter *Iterator, field string) bool {93mapped := locatePath(iter, path[1:])94if mapped.ValueType() != InvalidValue {95mappedAll[field] = mapped96}97return true98})99return wrapMap(mappedAll)100}101return newInvalidAny(path)102default:103return newInvalidAny(path)104}105}
106
107func (any *objectLazyAny) Keys() []string {108keys := []string{}109iter := any.cfg.BorrowIterator(any.buf)110defer any.cfg.ReturnIterator(iter)111iter.ReadMapCB(func(iter *Iterator, field string) bool {112iter.Skip()113keys = append(keys, field)114return true115})116return keys117}
118
119func (any *objectLazyAny) Size() int {120size := 0121iter := any.cfg.BorrowIterator(any.buf)122defer any.cfg.ReturnIterator(iter)123iter.ReadObjectCB(func(iter *Iterator, field string) bool {124iter.Skip()125size++126return true127})128return size129}
130
131func (any *objectLazyAny) WriteTo(stream *Stream) {132stream.Write(any.buf)133}
134
135func (any *objectLazyAny) GetInterface() interface{} {136iter := any.cfg.BorrowIterator(any.buf)137defer any.cfg.ReturnIterator(iter)138return iter.Read()139}
140
141type objectAny struct {142baseAny
143err error144val reflect.Value145}
146
147func wrapStruct(val interface{}) *objectAny {148return &objectAny{baseAny{}, nil, reflect.ValueOf(val)}149}
150
151func (any *objectAny) ValueType() ValueType {152return ObjectValue153}
154
155func (any *objectAny) MustBeValid() Any {156return any157}
158
159func (any *objectAny) Parse() *Iterator {160return nil161}
162
163func (any *objectAny) LastError() error {164return any.err165}
166
167func (any *objectAny) ToBool() bool {168return any.val.NumField() != 0169}
170
171func (any *objectAny) ToInt() int {172return 0173}
174
175func (any *objectAny) ToInt32() int32 {176return 0177}
178
179func (any *objectAny) ToInt64() int64 {180return 0181}
182
183func (any *objectAny) ToUint() uint {184return 0185}
186
187func (any *objectAny) ToUint32() uint32 {188return 0189}
190
191func (any *objectAny) ToUint64() uint64 {192return 0193}
194
195func (any *objectAny) ToFloat32() float32 {196return 0197}
198
199func (any *objectAny) ToFloat64() float64 {200return 0201}
202
203func (any *objectAny) ToString() string {204str, err := MarshalToString(any.val.Interface())205any.err = err206return str207}
208
209func (any *objectAny) Get(path ...interface{}) Any {210if len(path) == 0 {211return any212}213switch firstPath := path[0].(type) {214case string:215field := any.val.FieldByName(firstPath)216if !field.IsValid() {217return newInvalidAny(path)218}219return Wrap(field.Interface())220case int32:221if '*' == firstPath {222mappedAll := map[string]Any{}223for i := 0; i < any.val.NumField(); i++ {224field := any.val.Field(i)225if field.CanInterface() {226mapped := Wrap(field.Interface()).Get(path[1:]...)227if mapped.ValueType() != InvalidValue {228mappedAll[any.val.Type().Field(i).Name] = mapped229}230}231}232return wrapMap(mappedAll)233}234return newInvalidAny(path)235default:236return newInvalidAny(path)237}238}
239
240func (any *objectAny) Keys() []string {241keys := make([]string, 0, any.val.NumField())242for i := 0; i < any.val.NumField(); i++ {243keys = append(keys, any.val.Type().Field(i).Name)244}245return keys246}
247
248func (any *objectAny) Size() int {249return any.val.NumField()250}
251
252func (any *objectAny) WriteTo(stream *Stream) {253stream.WriteVal(any.val)254}
255
256func (any *objectAny) GetInterface() interface{} {257return any.val.Interface()258}
259
260type mapAny struct {261baseAny
262err error263val reflect.Value264}
265
266func wrapMap(val interface{}) *mapAny {267return &mapAny{baseAny{}, nil, reflect.ValueOf(val)}268}
269
270func (any *mapAny) ValueType() ValueType {271return ObjectValue272}
273
274func (any *mapAny) MustBeValid() Any {275return any276}
277
278func (any *mapAny) Parse() *Iterator {279return nil280}
281
282func (any *mapAny) LastError() error {283return any.err284}
285
286func (any *mapAny) ToBool() bool {287return true288}
289
290func (any *mapAny) ToInt() int {291return 0292}
293
294func (any *mapAny) ToInt32() int32 {295return 0296}
297
298func (any *mapAny) ToInt64() int64 {299return 0300}
301
302func (any *mapAny) ToUint() uint {303return 0304}
305
306func (any *mapAny) ToUint32() uint32 {307return 0308}
309
310func (any *mapAny) ToUint64() uint64 {311return 0312}
313
314func (any *mapAny) ToFloat32() float32 {315return 0316}
317
318func (any *mapAny) ToFloat64() float64 {319return 0320}
321
322func (any *mapAny) ToString() string {323str, err := MarshalToString(any.val.Interface())324any.err = err325return str326}
327
328func (any *mapAny) Get(path ...interface{}) Any {329if len(path) == 0 {330return any331}332switch firstPath := path[0].(type) {333case int32:334if '*' == firstPath {335mappedAll := map[string]Any{}336for _, key := range any.val.MapKeys() {337keyAsStr := key.String()338element := Wrap(any.val.MapIndex(key).Interface())339mapped := element.Get(path[1:]...)340if mapped.ValueType() != InvalidValue {341mappedAll[keyAsStr] = mapped342}343}344return wrapMap(mappedAll)345}346return newInvalidAny(path)347default:348value := any.val.MapIndex(reflect.ValueOf(firstPath))349if !value.IsValid() {350return newInvalidAny(path)351}352return Wrap(value.Interface())353}354}
355
356func (any *mapAny) Keys() []string {357keys := make([]string, 0, any.val.Len())358for _, key := range any.val.MapKeys() {359keys = append(keys, key.String())360}361return keys362}
363
364func (any *mapAny) Size() int {365return any.val.Len()366}
367
368func (any *mapAny) WriteTo(stream *Stream) {369stream.WriteVal(any.val)370}
371
372func (any *mapAny) GetInterface() interface{} {373return any.val.Interface()374}
375