8 type arrayLazyAny struct {
15 func (any *arrayLazyAny) ValueType() ValueType {
19 func (any *arrayLazyAny) MustBeValid() Any {
23 func (any *arrayLazyAny) LastError() error {
27 func (any *arrayLazyAny) ToBool() bool {
28 iter := any.cfg.BorrowIterator(any.buf)
29 defer any.cfg.ReturnIterator(iter)
30 return iter.ReadArray()
33 func (any *arrayLazyAny) ToInt() int {
40 func (any *arrayLazyAny) ToInt32() int32 {
47 func (any *arrayLazyAny) ToInt64() int64 {
54 func (any *arrayLazyAny) ToUint() uint {
61 func (any *arrayLazyAny) ToUint32() uint32 {
68 func (any *arrayLazyAny) ToUint64() uint64 {
75 func (any *arrayLazyAny) ToFloat32() float32 {
82 func (any *arrayLazyAny) ToFloat64() float64 {
89 func (any *arrayLazyAny) ToString() string {
90 return *(*string)(unsafe.Pointer(&any.buf))
93 func (any *arrayLazyAny) ToVal(val interface{}) {
94 iter := any.cfg.BorrowIterator(any.buf)
95 defer any.cfg.ReturnIterator(iter)
99 func (any *arrayLazyAny) Get(path ...interface{}) Any {
103 switch firstPath := path[0].(type) {
105 iter := any.cfg.BorrowIterator(any.buf)
106 defer any.cfg.ReturnIterator(iter)
107 valueBytes := locateArrayElement(iter, firstPath)
108 if valueBytes == nil {
109 return newInvalidAny(path)
111 iter.ResetBytes(valueBytes)
112 return locatePath(iter, path[1:])
114 if '*' == firstPath {
115 iter := any.cfg.BorrowIterator(any.buf)
116 defer any.cfg.ReturnIterator(iter)
117 arr := make([]Any, 0)
118 iter.ReadArrayCB(func(iter *Iterator) bool {
119 found := iter.readAny().Get(path[1:]...)
120 if found.ValueType() != InvalidValue {
121 arr = append(arr, found)
125 return wrapArray(arr)
127 return newInvalidAny(path)
129 return newInvalidAny(path)
133 func (any *arrayLazyAny) Size() int {
135 iter := any.cfg.BorrowIterator(any.buf)
136 defer any.cfg.ReturnIterator(iter)
137 iter.ReadArrayCB(func(iter *Iterator) bool {
145 func (any *arrayLazyAny) WriteTo(stream *Stream) {
146 stream.Write(any.buf)
149 func (any *arrayLazyAny) GetInterface() interface{} {
150 iter := any.cfg.BorrowIterator(any.buf)
151 defer any.cfg.ReturnIterator(iter)
155 type arrayAny struct {
160 func wrapArray(val interface{}) *arrayAny {
161 return &arrayAny{baseAny{}, reflect.ValueOf(val)}
164 func (any *arrayAny) ValueType() ValueType {
168 func (any *arrayAny) MustBeValid() Any {
172 func (any *arrayAny) LastError() error {
176 func (any *arrayAny) ToBool() bool {
177 return any.val.Len() != 0
180 func (any *arrayAny) ToInt() int {
181 if any.val.Len() == 0 {
187 func (any *arrayAny) ToInt32() int32 {
188 if any.val.Len() == 0 {
194 func (any *arrayAny) ToInt64() int64 {
195 if any.val.Len() == 0 {
201 func (any *arrayAny) ToUint() uint {
202 if any.val.Len() == 0 {
208 func (any *arrayAny) ToUint32() uint32 {
209 if any.val.Len() == 0 {
215 func (any *arrayAny) ToUint64() uint64 {
216 if any.val.Len() == 0 {
222 func (any *arrayAny) ToFloat32() float32 {
223 if any.val.Len() == 0 {
229 func (any *arrayAny) ToFloat64() float64 {
230 if any.val.Len() == 0 {
236 func (any *arrayAny) ToString() string {
237 str, _ := MarshalToString(any.val.Interface())
241 func (any *arrayAny) Get(path ...interface{}) Any {
245 switch firstPath := path[0].(type) {
247 if firstPath < 0 || firstPath >= any.val.Len() {
248 return newInvalidAny(path)
250 return Wrap(any.val.Index(firstPath).Interface())
252 if '*' == firstPath {
253 mappedAll := make([]Any, 0)
254 for i := 0; i < any.val.Len(); i++ {
255 mapped := Wrap(any.val.Index(i).Interface()).Get(path[1:]...)
256 if mapped.ValueType() != InvalidValue {
257 mappedAll = append(mappedAll, mapped)
260 return wrapArray(mappedAll)
262 return newInvalidAny(path)
264 return newInvalidAny(path)
268 func (any *arrayAny) Size() int {
272 func (any *arrayAny) WriteTo(stream *Stream) {
273 stream.WriteVal(any.val)
276 func (any *arrayAny) GetInterface() interface{} {
277 return any.val.Interface()