feature_any.go 4.8 KB

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