github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/jsoni/any_number.go (about) 1 package jsoni 2 3 import ( 4 "context" 5 "io" 6 "unsafe" 7 ) 8 9 type numberLazyAny struct { 10 baseAny 11 cfg *frozenConfig 12 buf []byte 13 err error 14 } 15 16 func (a *numberLazyAny) ValueType() ValueType { return NumberValue } 17 func (a *numberLazyAny) MustBeValid() Any { return a } 18 func (a *numberLazyAny) LastError() error { return a.err } 19 func (a *numberLazyAny) ToBool() bool { return a.ToFloat64() != 0 } 20 21 func (a *numberLazyAny) iterFunc(f func(*Iterator)) { 22 i := a.cfg.BorrowIterator(a.buf) 23 f(i) 24 if i.Error != nil && i.Error != io.EOF { 25 a.err = i.Error 26 } 27 28 a.cfg.ReturnIterator(i) 29 } 30 31 func (a *numberLazyAny) ToInt() (val int) { 32 a.iterFunc(func(iter *Iterator) { val = iter.ReadInt() }) 33 return 34 } 35 36 func (a *numberLazyAny) ToInt32() (val int32) { 37 a.iterFunc(func(i *Iterator) { val = i.ReadInt32() }) 38 return 39 } 40 41 func (a *numberLazyAny) ToInt64() (val int64) { 42 a.iterFunc(func(i *Iterator) { val = i.ReadInt64() }) 43 return 44 } 45 46 func (a *numberLazyAny) ToUint() (val uint) { 47 a.iterFunc(func(i *Iterator) { val = i.ReadUint() }) 48 return 49 } 50 51 func (a *numberLazyAny) ToUint32() (val uint32) { 52 a.iterFunc(func(i *Iterator) { val = i.ReadUint32() }) 53 return 54 } 55 56 func (a *numberLazyAny) ToUint64() (val uint64) { 57 a.iterFunc(func(i *Iterator) { val = i.ReadUint64() }) 58 return 59 } 60 61 func (a *numberLazyAny) ToFloat32() (val float32) { 62 a.iterFunc(func(i *Iterator) { val = i.ReadFloat32() }) 63 return 64 } 65 66 func (a *numberLazyAny) ToFloat64() (val float64) { 67 a.iterFunc(func(i *Iterator) { val = i.ReadFloat64() }) 68 return 69 } 70 71 func (a *numberLazyAny) ToString() string { return *(*string)(unsafe.Pointer(&a.buf)) } 72 func (a *numberLazyAny) WriteTo(_ context.Context, stream *Stream) { stream.Write(a.buf) } 73 74 func (a *numberLazyAny) GetInterface(ctx context.Context) (val interface{}) { 75 a.iterFunc(func(i *Iterator) { val = i.Read(ctx) }) 76 return 77 }