feature_any.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. package jsoniter
  2. import (
  3. "fmt"
  4. "reflect"
  5. )
  6. type Any interface {
  7. LastError() error
  8. ValueType() ValueType
  9. ToBool() bool
  10. ToInt() int
  11. ToInt32() int32
  12. ToInt64() int64
  13. ToUint() uint
  14. ToUint32() uint32
  15. ToUint64() uint64
  16. ToFloat32() float32
  17. ToFloat64() float64
  18. ToString() string
  19. Get(path ...interface{}) Any
  20. Size() int
  21. Keys() []string
  22. IterateObject() (func() (string, Any, bool), bool)
  23. IterateArray() (func() (Any, bool), bool)
  24. GetArray() []Any
  25. SetArray(newList []Any) bool
  26. GetObject() map[string]Any
  27. SetObject(map[string]Any) bool
  28. GetInterface() interface{}
  29. WriteTo(stream *Stream)
  30. }
  31. type baseAny struct{}
  32. func (any *baseAny) Get(path ...interface{}) Any {
  33. return &invalidAny{baseAny{}, fmt.Errorf("Get %v from simple value", path)}
  34. }
  35. func (any *baseAny) Size() int {
  36. return 0
  37. }
  38. func (any *baseAny) Keys() []string {
  39. return []string{}
  40. }
  41. func (any *baseAny) IterateObject() (func() (string, Any, bool), bool) {
  42. return nil, false
  43. }
  44. func (any *baseAny) IterateArray() (func() (Any, bool), bool) {
  45. return nil, false
  46. }
  47. func (any *baseAny) GetArray() []Any {
  48. return []Any{}
  49. }
  50. func (any *baseAny) SetArray(newList []Any) bool {
  51. return false
  52. }
  53. func (any *baseAny) GetObject() map[string]Any {
  54. return map[string]Any{}
  55. }
  56. func (any *baseAny) SetObject(map[string]Any) bool {
  57. return false
  58. }
  59. func WrapInt32(val int32) Any {
  60. return &int32Any{baseAny{}, val}
  61. }
  62. func WrapInt64(val int64) Any {
  63. return &int64Any{baseAny{}, val}
  64. }
  65. func WrapUint32(val uint32) Any {
  66. return &uint32Any{baseAny{}, val}
  67. }
  68. func WrapUint64(val uint64) Any {
  69. return &uint64Any{baseAny{}, val}
  70. }
  71. func WrapFloat64(val float64) Any {
  72. return &floatAny{baseAny{}, val}
  73. }
  74. func WrapString(val string) Any {
  75. return &stringAny{baseAny{}, nil, val}
  76. }
  77. func Wrap(val interface{}) Any {
  78. if val == nil {
  79. return &nilAny{}
  80. }
  81. asAny, isAny := val.(Any)
  82. if isAny {
  83. return asAny
  84. }
  85. type_ := reflect.TypeOf(val)
  86. switch type_.Kind() {
  87. case reflect.Slice:
  88. return wrapArray(val)
  89. case reflect.Struct:
  90. return wrapStruct(val)
  91. case reflect.Map:
  92. return wrapMap(val)
  93. case reflect.String:
  94. return WrapString(val.(string))
  95. case reflect.Int:
  96. return WrapInt64(int64(val.(int)))
  97. case reflect.Int8:
  98. return WrapInt32(int32(val.(int8)))
  99. case reflect.Int16:
  100. return WrapInt32(int32(val.(int16)))
  101. case reflect.Int32:
  102. return WrapInt32(val.(int32))
  103. case reflect.Int64:
  104. return WrapInt64(val.(int64))
  105. case reflect.Uint:
  106. return WrapUint64(uint64(val.(uint)))
  107. case reflect.Uint8:
  108. return WrapUint32(uint32(val.(uint8)))
  109. case reflect.Uint16:
  110. return WrapUint32(uint32(val.(uint16)))
  111. case reflect.Uint32:
  112. return WrapUint32(uint32(val.(uint32)))
  113. case reflect.Uint64:
  114. return WrapUint64(val.(uint64))
  115. case reflect.Float32:
  116. return WrapFloat64(float64(val.(float32)))
  117. case reflect.Float64:
  118. return WrapFloat64(val.(float64))
  119. case reflect.Bool:
  120. if val.(bool) == true {
  121. return &trueAny{}
  122. } else {
  123. return &falseAny{}
  124. }
  125. }
  126. return &invalidAny{baseAny{}, fmt.Errorf("unsupported type: %v", type_)}
  127. }
  128. func (iter *Iterator) ReadAny() Any {
  129. return iter.readAny()
  130. }
  131. func (iter *Iterator) readAny() Any {
  132. c := iter.nextToken()
  133. switch c {
  134. case '"':
  135. return iter.readStringAny()
  136. case 'n':
  137. iter.skipFixedBytes(3) // null
  138. return &nilAny{}
  139. case 't':
  140. iter.skipFixedBytes(3) // true
  141. return &trueAny{}
  142. case 'f':
  143. iter.skipFixedBytes(4) // false
  144. return &falseAny{}
  145. case '{':
  146. return iter.readObjectAny()
  147. case '[':
  148. return iter.readArrayAny()
  149. case '-':
  150. return iter.readNumberAny(false)
  151. default:
  152. return iter.readNumberAny(true)
  153. }
  154. }
  155. func (iter *Iterator) readNumberAny(positive bool) Any {
  156. iter.startCapture(iter.head - 1)
  157. dotFound := iter.skipNumberAndTellDotFoundOrNot()
  158. lazyBuf := iter.stopCapture()
  159. if dotFound {
  160. return &float64LazyAny{baseAny{}, iter.cfg, lazyBuf, nil, 0}
  161. } else {
  162. if positive {
  163. return &uint64LazyAny{baseAny{}, iter.cfg, lazyBuf, nil, 0}
  164. } else {
  165. return &int64LazyAny{baseAny{}, iter.cfg, lazyBuf, nil, 0}
  166. }
  167. }
  168. }
  169. func (iter *Iterator) readStringAny() Any {
  170. iter.startCapture(iter.head - 1)
  171. iter.skipString()
  172. lazyBuf := iter.stopCapture()
  173. return &stringLazyAny{baseAny{}, iter.cfg, lazyBuf, nil, ""}
  174. }
  175. func (iter *Iterator) readObjectAny() Any {
  176. iter.startCapture(iter.head - 1)
  177. iter.skipObject()
  178. lazyBuf := iter.stopCapture()
  179. return &objectLazyAny{baseAny{}, iter.cfg, lazyBuf, nil, nil, lazyBuf}
  180. }
  181. func (iter *Iterator) readArrayAny() Any {
  182. iter.startCapture(iter.head - 1)
  183. iter.skipArray()
  184. lazyBuf := iter.stopCapture()
  185. return &arrayLazyAny{baseAny{}, iter.cfg, lazyBuf, nil, nil, lazyBuf}
  186. }