feature_any.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. package jsoniter
  2. import (
  3. "fmt"
  4. "io"
  5. "reflect"
  6. )
  7. type Any interface {
  8. LastError() error
  9. ValueType() ValueType
  10. MustBeValid() Any
  11. ToBool() bool
  12. ToInt() int
  13. ToInt32() int32
  14. ToInt64() int64
  15. ToUint() uint
  16. ToUint32() uint32
  17. ToUint64() uint64
  18. ToFloat32() float32
  19. ToFloat64() float64
  20. ToString() string
  21. ToVal(val interface{})
  22. Get(path ...interface{}) Any
  23. // TODO: add Set
  24. Size() int
  25. Keys() []string
  26. // TODO: remove me
  27. GetArray() []Any
  28. // TODO: remove me
  29. GetObject() map[string]Any
  30. GetInterface() interface{}
  31. WriteTo(stream *Stream)
  32. }
  33. type baseAny struct{}
  34. func (any *baseAny) Get(path ...interface{}) Any {
  35. return &invalidAny{baseAny{}, fmt.Errorf("Get %v from simple value", path)}
  36. }
  37. func (any *baseAny) Size() int {
  38. return 0
  39. }
  40. func (any *baseAny) Keys() []string {
  41. return []string{}
  42. }
  43. func (any *baseAny) GetArray() []Any {
  44. return []Any{}
  45. }
  46. func (any *baseAny) GetObject() map[string]Any {
  47. return map[string]Any{}
  48. }
  49. func (any *baseAny) ToVal(obj interface{}) {
  50. panic("not implemented")
  51. }
  52. func WrapInt32(val int32) Any {
  53. return &int32Any{baseAny{}, val}
  54. }
  55. func WrapInt64(val int64) Any {
  56. return &int64Any{baseAny{}, val}
  57. }
  58. func WrapUint32(val uint32) Any {
  59. return &uint32Any{baseAny{}, val}
  60. }
  61. func WrapUint64(val uint64) Any {
  62. return &uint64Any{baseAny{}, val}
  63. }
  64. func WrapFloat64(val float64) Any {
  65. return &floatAny{baseAny{}, val}
  66. }
  67. func WrapString(val string) Any {
  68. return &stringAny{baseAny{}, val}
  69. }
  70. func Wrap(val interface{}) Any {
  71. if val == nil {
  72. return &nilAny{}
  73. }
  74. asAny, isAny := val.(Any)
  75. if isAny {
  76. return asAny
  77. }
  78. type_ := reflect.TypeOf(val)
  79. switch type_.Kind() {
  80. case reflect.Slice:
  81. return wrapArray(val)
  82. case reflect.Struct:
  83. return wrapStruct(val)
  84. case reflect.Map:
  85. return wrapMap(val)
  86. case reflect.String:
  87. return WrapString(val.(string))
  88. case reflect.Int:
  89. return WrapInt64(int64(val.(int)))
  90. case reflect.Int8:
  91. return WrapInt32(int32(val.(int8)))
  92. case reflect.Int16:
  93. return WrapInt32(int32(val.(int16)))
  94. case reflect.Int32:
  95. return WrapInt32(val.(int32))
  96. case reflect.Int64:
  97. return WrapInt64(val.(int64))
  98. case reflect.Uint:
  99. return WrapUint64(uint64(val.(uint)))
  100. case reflect.Uint8:
  101. return WrapUint32(uint32(val.(uint8)))
  102. case reflect.Uint16:
  103. return WrapUint32(uint32(val.(uint16)))
  104. case reflect.Uint32:
  105. return WrapUint32(uint32(val.(uint32)))
  106. case reflect.Uint64:
  107. return WrapUint64(val.(uint64))
  108. case reflect.Float32:
  109. return WrapFloat64(float64(val.(float32)))
  110. case reflect.Float64:
  111. return WrapFloat64(val.(float64))
  112. case reflect.Bool:
  113. if val.(bool) == true {
  114. return &trueAny{}
  115. } else {
  116. return &falseAny{}
  117. }
  118. }
  119. return &invalidAny{baseAny{}, fmt.Errorf("unsupported type: %v", type_)}
  120. }
  121. func (iter *Iterator) ReadAny() Any {
  122. return iter.readAny()
  123. }
  124. func (iter *Iterator) readAny() Any {
  125. c := iter.nextToken()
  126. switch c {
  127. case '"':
  128. iter.unreadByte()
  129. return &stringAny{baseAny{}, iter.ReadString()}
  130. case 'n':
  131. iter.skipFixedBytes(3) // null
  132. return &nilAny{}
  133. case 't':
  134. iter.skipFixedBytes(3) // true
  135. return &trueAny{}
  136. case 'f':
  137. iter.skipFixedBytes(4) // false
  138. return &falseAny{}
  139. case '{':
  140. return iter.readObjectAny()
  141. case '[':
  142. return iter.readArrayAny()
  143. case '-':
  144. return iter.readNumberAny(false)
  145. default:
  146. return iter.readNumberAny(true)
  147. }
  148. }
  149. func (iter *Iterator) readNumberAny(positive bool) Any {
  150. iter.startCapture(iter.head - 1)
  151. iter.skipNumber()
  152. lazyBuf := iter.stopCapture()
  153. return &numberLazyAny{baseAny{}, iter.cfg, lazyBuf, nil}
  154. }
  155. func (iter *Iterator) readObjectAny() Any {
  156. iter.startCapture(iter.head - 1)
  157. iter.skipObject()
  158. lazyBuf := iter.stopCapture()
  159. return &objectLazyAny{baseAny{}, iter.cfg, lazyBuf, nil}
  160. }
  161. func (iter *Iterator) readArrayAny() Any {
  162. iter.startCapture(iter.head - 1)
  163. iter.skipArray()
  164. lazyBuf := iter.stopCapture()
  165. return &arrayLazyAny{baseAny{}, iter.cfg, lazyBuf, nil}
  166. }
  167. func locateObjectField(iter *Iterator, target string) []byte {
  168. var found []byte
  169. iter.ReadObjectCB(func(iter *Iterator, field string) bool {
  170. if field == target {
  171. found = iter.SkipAndReturnBytes()
  172. return false
  173. }
  174. iter.Skip()
  175. return true
  176. })
  177. return found
  178. }
  179. func locateArrayElement(iter *Iterator, target int) []byte {
  180. var found []byte
  181. n := 0
  182. iter.ReadArrayCB(func(iter *Iterator) bool {
  183. if n == target {
  184. found = iter.SkipAndReturnBytes()
  185. return false
  186. }
  187. iter.Skip()
  188. n++
  189. return true
  190. })
  191. return found
  192. }
  193. func locatePath(iter *Iterator, path []interface{}) Any {
  194. for i, pathKeyObj := range path {
  195. switch pathKey := pathKeyObj.(type) {
  196. case string:
  197. valueBytes := locateObjectField(iter, pathKey)
  198. if valueBytes == nil {
  199. return newInvalidAny(path[i:])
  200. }
  201. iter.ResetBytes(valueBytes)
  202. case int:
  203. valueBytes := locateArrayElement(iter, pathKey)
  204. if valueBytes == nil {
  205. return newInvalidAny(path[i:])
  206. }
  207. iter.ResetBytes(valueBytes)
  208. case int32:
  209. if '*' == pathKey {
  210. return iter.readAny().Get(path[i:]...)
  211. } else {
  212. return newInvalidAny(path[i:])
  213. }
  214. default:
  215. return newInvalidAny(path[i:])
  216. }
  217. }
  218. if iter.Error != nil && iter.Error != io.EOF {
  219. return &invalidAny{baseAny{}, iter.Error}
  220. }
  221. return iter.readAny()
  222. }