feature_any.go 4.9 KB

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