8 type objectLazyAny struct {
15 func (any *objectLazyAny) ValueType() ValueType {
19 func (any *objectLazyAny) MustBeValid() Any {
23 func (any *objectLazyAny) LastError() error {
27 func (any *objectLazyAny) ToBool() bool {
31 func (any *objectLazyAny) ToInt() int {
35 func (any *objectLazyAny) ToInt32() int32 {
39 func (any *objectLazyAny) ToInt64() int64 {
43 func (any *objectLazyAny) ToUint() uint {
47 func (any *objectLazyAny) ToUint32() uint32 {
51 func (any *objectLazyAny) ToUint64() uint64 {
55 func (any *objectLazyAny) ToFloat32() float32 {
59 func (any *objectLazyAny) ToFloat64() float64 {
63 func (any *objectLazyAny) ToString() string {
64 return *(*string)(unsafe.Pointer(&any.buf))
67 func (any *objectLazyAny) ToVal(obj interface{}) {
68 iter := any.cfg.BorrowIterator(any.buf)
69 defer any.cfg.ReturnIterator(iter)
73 func (any *objectLazyAny) Get(path ...interface{}) Any {
77 switch firstPath := path[0].(type) {
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)
85 iter.ResetBytes(valueBytes)
86 return locatePath(iter, path[1:])
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
99 return wrapMap(mappedAll)
101 return newInvalidAny(path)
103 return newInvalidAny(path)
107 func (any *objectLazyAny) Keys() []string {
109 iter := any.cfg.BorrowIterator(any.buf)
110 defer any.cfg.ReturnIterator(iter)
111 iter.ReadMapCB(func(iter *Iterator, field string) bool {
113 keys = append(keys, field)
119 func (any *objectLazyAny) Size() int {
121 iter := any.cfg.BorrowIterator(any.buf)
122 defer any.cfg.ReturnIterator(iter)
123 iter.ReadObjectCB(func(iter *Iterator, field string) bool {
131 func (any *objectLazyAny) WriteTo(stream *Stream) {
132 stream.Write(any.buf)
135 func (any *objectLazyAny) GetInterface() interface{} {
136 iter := any.cfg.BorrowIterator(any.buf)
137 defer any.cfg.ReturnIterator(iter)
141 type objectAny struct {
147 func wrapStruct(val interface{}) *objectAny {
148 return &objectAny{baseAny{}, nil, reflect.ValueOf(val)}
151 func (any *objectAny) ValueType() ValueType {
155 func (any *objectAny) MustBeValid() Any {
159 func (any *objectAny) Parse() *Iterator {
163 func (any *objectAny) LastError() error {
167 func (any *objectAny) ToBool() bool {
168 return any.val.NumField() != 0
171 func (any *objectAny) ToInt() int {
175 func (any *objectAny) ToInt32() int32 {
179 func (any *objectAny) ToInt64() int64 {
183 func (any *objectAny) ToUint() uint {
187 func (any *objectAny) ToUint32() uint32 {
191 func (any *objectAny) ToUint64() uint64 {
195 func (any *objectAny) ToFloat32() float32 {
199 func (any *objectAny) ToFloat64() float64 {
203 func (any *objectAny) ToString() string {
204 str, err := MarshalToString(any.val.Interface())
209 func (any *objectAny) Get(path ...interface{}) Any {
213 switch firstPath := path[0].(type) {
215 field := any.val.FieldByName(firstPath)
216 if !field.IsValid() {
217 return newInvalidAny(path)
219 return Wrap(field.Interface())
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
232 return wrapMap(mappedAll)
234 return newInvalidAny(path)
236 return newInvalidAny(path)
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)
248 func (any *objectAny) Size() int {
249 return any.val.NumField()
252 func (any *objectAny) WriteTo(stream *Stream) {
253 stream.WriteVal(any.val)
256 func (any *objectAny) GetInterface() interface{} {
257 return any.val.Interface()
266 func wrapMap(val interface{}) *mapAny {
267 return &mapAny{baseAny{}, nil, reflect.ValueOf(val)}
270 func (any *mapAny) ValueType() ValueType {
274 func (any *mapAny) MustBeValid() Any {
278 func (any *mapAny) Parse() *Iterator {
282 func (any *mapAny) LastError() error {
286 func (any *mapAny) ToBool() bool {
290 func (any *mapAny) ToInt() int {
294 func (any *mapAny) ToInt32() int32 {
298 func (any *mapAny) ToInt64() int64 {
302 func (any *mapAny) ToUint() uint {
306 func (any *mapAny) ToUint32() uint32 {
310 func (any *mapAny) ToUint64() uint64 {
314 func (any *mapAny) ToFloat32() float32 {
318 func (any *mapAny) ToFloat64() float64 {
322 func (any *mapAny) ToString() string {
323 str, err := MarshalToString(any.val.Interface())
328 func (any *mapAny) Get(path ...interface{}) Any {
332 switch firstPath := path[0].(type) {
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
344 return wrapMap(mappedAll)
346 return newInvalidAny(path)
348 value := any.val.MapIndex(reflect.ValueOf(firstPath))
349 if !value.IsValid() {
350 return newInvalidAny(path)
352 return Wrap(value.Interface())
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())
364 func (any *mapAny) Size() int {
368 func (any *mapAny) WriteTo(stream *Stream) {
369 stream.WriteVal(any.val)
372 func (any *mapAny) GetInterface() interface{} {
373 return any.val.Interface()