jsoniter.go 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. package jsoniter
  2. import (
  3. fflib "github.com/pquerna/ffjson/fflib/v1"
  4. "strconv"
  5. "fmt"
  6. )
  7. type Token fflib.FFTok
  8. const TokenInteger = Token(fflib.FFTok_integer)
  9. const TokenDouble = Token(fflib.FFTok_double)
  10. const TokenBool = Token(fflib.FFTok_bool)
  11. const TokenError = Token(fflib.FFTok_error)
  12. const TokenLeftBrace = Token(fflib.FFTok_left_brace)
  13. const TokenLeftBracket = Token(fflib.FFTok_left_bracket)
  14. const TokenRightBrace = Token(fflib.FFTok_right_brace)
  15. const TokenRightBracket = Token(fflib.FFTok_right_bracket)
  16. const TokenComma = Token(fflib.FFTok_comma)
  17. const TokenString = Token(fflib.FFTok_string)
  18. const TokenColon = Token(fflib.FFTok_colon)
  19. func (tok Token) ToString() string {
  20. return fmt.Sprintf("%v", fflib.FFTok(tok))
  21. }
  22. type Iterator struct {
  23. ErrorHandler func(error)
  24. lexer *fflib.FFLexer
  25. }
  26. type UnexpectedToken struct {
  27. Expected Token
  28. Actual Token
  29. }
  30. func (err *UnexpectedToken) Error() string {
  31. return fmt.Sprintf("unexpected token, expected %v, actual %v", fflib.FFTok(err.Expected), fflib.FFTok(err.Actual))
  32. }
  33. func NewIterator(input []byte) Iterator {
  34. lexer := fflib.NewFFLexer(input)
  35. return Iterator{
  36. lexer: lexer,
  37. }
  38. }
  39. func (iter Iterator) ReadArray(callback func(Iterator, int)) {
  40. lexer := iter.lexer
  41. if !iter.AssertToken(TokenLeftBrace) {
  42. return
  43. }
  44. index := 0
  45. for {
  46. lexer.Scan()
  47. callback(iter, index)
  48. index += 1
  49. if iter.Token() != TokenComma {
  50. break
  51. }
  52. }
  53. iter.AssertToken(TokenRightBrace)
  54. lexer.Scan()
  55. }
  56. func (iter Iterator) ReadObject(callback func(Iterator, string)) {
  57. lexer := iter.lexer
  58. if !iter.AssertToken(TokenLeftBracket) {
  59. return
  60. }
  61. for {
  62. lexer.Scan()
  63. field := iter.ReadString()
  64. iter.AssertToken(TokenColon)
  65. lexer.Scan()
  66. callback(iter, field)
  67. if iter.Token() != TokenComma {
  68. break
  69. }
  70. }
  71. iter.AssertToken(TokenRightBracket)
  72. lexer.Scan()
  73. }
  74. func (iter Iterator) Skip() {
  75. switch iter.Token() {
  76. case TokenLeftBracket:
  77. iter.ReadObject(func(iter Iterator, field string) {
  78. iter.Skip()
  79. })
  80. case TokenLeftBrace:
  81. iter.ReadArray(func(iter Iterator, index int) {
  82. iter.Skip()
  83. })
  84. default:
  85. iter.lexer.Scan()
  86. }
  87. }
  88. func (iter Iterator) ReadInt8() (rval int8) {
  89. lexer := iter.lexer
  90. if !iter.AssertToken(TokenInteger) {
  91. return
  92. }
  93. field, err := lexer.CaptureField(lexer.Token)
  94. if err != nil {
  95. iter.OnError(err)
  96. return
  97. }
  98. lexer.Scan()
  99. number, err := strconv.ParseInt(string(field), 10, 8)
  100. if err != nil {
  101. iter.OnError(fmt.Errorf("failed to convert %v: %v", string(field), err.Error()))
  102. return
  103. }
  104. return int8(number)
  105. }
  106. func (iter Iterator) ReadInt16() (rval int16) {
  107. lexer := iter.lexer
  108. if !iter.AssertToken(TokenInteger) {
  109. return
  110. }
  111. field, err := lexer.CaptureField(lexer.Token)
  112. if err != nil {
  113. iter.OnError(err)
  114. return
  115. }
  116. lexer.Scan()
  117. number, err := strconv.ParseInt(string(field), 10, 16)
  118. if err != nil {
  119. iter.OnError(fmt.Errorf("failed to convert %v: %v", string(field), err.Error()))
  120. return
  121. }
  122. return int16(number)
  123. }
  124. func (iter Iterator) ReadInt32() (rval int32) {
  125. lexer := iter.lexer
  126. if !iter.AssertToken(TokenInteger) {
  127. return
  128. }
  129. field, err := lexer.CaptureField(lexer.Token)
  130. if err != nil {
  131. iter.OnError(err)
  132. return
  133. }
  134. lexer.Scan()
  135. number, err := strconv.ParseInt(string(field), 10, 32)
  136. if err != nil {
  137. iter.OnError(fmt.Errorf("failed to convert %v: %v", string(field), err.Error()))
  138. return
  139. }
  140. return int32(number)
  141. }
  142. func (iter Iterator) ReadInt64() (rval int64) {
  143. lexer := iter.lexer
  144. if !iter.AssertToken(TokenInteger) {
  145. return
  146. }
  147. field, err := lexer.CaptureField(lexer.Token)
  148. if err != nil {
  149. iter.OnError(err)
  150. return
  151. }
  152. lexer.Scan()
  153. number, err := strconv.ParseInt(string(field), 10, 64)
  154. if err != nil {
  155. iter.OnError(fmt.Errorf("failed to convert %v: %v", string(field), err.Error()))
  156. return
  157. }
  158. return number
  159. }
  160. func (iter Iterator) ReadInt() (rval int) {
  161. lexer := iter.lexer
  162. n, err := lexer.LexInt64()
  163. if err != nil {
  164. iter.OnError(err)
  165. return
  166. }
  167. return int(n)
  168. }
  169. func (iter Iterator) ReadUint() (rval uint) {
  170. lexer := iter.lexer
  171. if !iter.AssertToken(TokenInteger) {
  172. return
  173. }
  174. field, err := lexer.CaptureField(lexer.Token)
  175. if err != nil {
  176. iter.OnError(err)
  177. return
  178. }
  179. lexer.Scan()
  180. number, err := strconv.ParseUint(string(field), 10, 64)
  181. if err != nil {
  182. iter.OnError(fmt.Errorf("failed to convert %v: %v", string(field), err.Error()))
  183. return
  184. }
  185. return uint(number)
  186. }
  187. func (iter Iterator) ReadUint8() (rval uint8) {
  188. lexer := iter.lexer
  189. if !iter.AssertToken(TokenInteger) {
  190. return
  191. }
  192. field, err := lexer.CaptureField(lexer.Token)
  193. if err != nil {
  194. iter.OnError(err)
  195. return
  196. }
  197. lexer.Scan()
  198. number, err := strconv.ParseUint(string(field), 10, 8)
  199. if err != nil {
  200. iter.OnError(fmt.Errorf("failed to convert %v: %v", string(field), err.Error()))
  201. return
  202. }
  203. return uint8(number)
  204. }
  205. func (iter Iterator) ReadUint16() (rval uint16) {
  206. lexer := iter.lexer
  207. if !iter.AssertToken(TokenInteger) {
  208. return
  209. }
  210. field, err := lexer.CaptureField(lexer.Token)
  211. if err != nil {
  212. iter.OnError(err)
  213. return
  214. }
  215. lexer.Scan()
  216. number, err := strconv.ParseUint(string(field), 10, 16)
  217. if err != nil {
  218. iter.OnError(fmt.Errorf("failed to convert %v: %v", string(field), err.Error()))
  219. return
  220. }
  221. return uint16(number)
  222. }
  223. func (iter Iterator) ReadUint32() (rval uint32) {
  224. lexer := iter.lexer
  225. if !iter.AssertToken(TokenInteger) {
  226. return
  227. }
  228. field, err := lexer.CaptureField(lexer.Token)
  229. if err != nil {
  230. iter.OnError(err)
  231. return
  232. }
  233. lexer.Scan()
  234. number, err := strconv.ParseUint(string(field), 10, 32)
  235. if err != nil {
  236. iter.OnError(fmt.Errorf("failed to convert %v: %v", string(field), err.Error()))
  237. return
  238. }
  239. return uint32(number)
  240. }
  241. func (iter Iterator) ReadUint64() (rval uint64) {
  242. lexer := iter.lexer
  243. if !iter.AssertToken(TokenInteger) {
  244. return
  245. }
  246. field, err := lexer.CaptureField(lexer.Token)
  247. if err != nil {
  248. iter.OnError(err)
  249. return
  250. }
  251. lexer.Scan()
  252. number, err := strconv.ParseUint(string(field), 10, 64)
  253. if err != nil {
  254. iter.OnError(fmt.Errorf("failed to convert %v: %v", string(field), err.Error()))
  255. return
  256. }
  257. return uint64(number)
  258. }
  259. func (iter Iterator) ReadFloat32() (rval float32) {
  260. lexer := iter.lexer
  261. if !iter.AssertToken(TokenDouble) {
  262. return
  263. }
  264. field, err := lexer.CaptureField(lexer.Token)
  265. if err != nil {
  266. iter.OnError(err)
  267. return
  268. }
  269. lexer.Scan()
  270. number, err := strconv.ParseFloat(string(field), 32)
  271. if err != nil {
  272. iter.OnError(fmt.Errorf("failed to convert %v: %v", string(field), err.Error()))
  273. return
  274. }
  275. return float32(number)
  276. }
  277. func (iter Iterator) ReadFloat64() (rval float64) {
  278. lexer := iter.lexer
  279. if !iter.AssertToken(TokenDouble) {
  280. return
  281. }
  282. field, err := lexer.CaptureField(lexer.Token)
  283. if err != nil {
  284. iter.OnError(err)
  285. return
  286. }
  287. lexer.Scan()
  288. number, err := strconv.ParseFloat(string(field), 64)
  289. if err != nil {
  290. iter.OnError(fmt.Errorf("failed to convert %v: %v", string(field), err.Error()))
  291. return
  292. }
  293. return float64(number)
  294. }
  295. func (iter Iterator) ReadString() (rval string) {
  296. lexer := iter.lexer
  297. if !iter.AssertToken(TokenString) {
  298. return
  299. }
  300. field, err := lexer.CaptureField(lexer.Token)
  301. if err != nil {
  302. iter.OnError(err)
  303. return
  304. }
  305. lexer.Scan()
  306. return string(field[1:len(field) - 1])
  307. }
  308. func (iter Iterator) AssertToken(expected Token) bool {
  309. actual := iter.Token()
  310. if expected != actual {
  311. if actual == TokenError {
  312. fmt.Println(iter.lexer.BigError.Error())
  313. }
  314. iter.OnError(&UnexpectedToken{
  315. Expected: expected,
  316. Actual: actual,
  317. })
  318. return false
  319. }
  320. return true
  321. }
  322. func (iter Iterator) Token() Token {
  323. return Token(iter.lexer.Token)
  324. }
  325. func (iter *Iterator) OnError(err error) {
  326. if iter.ErrorHandler == nil {
  327. panic(err.Error())
  328. } else {
  329. iter.ErrorHandler(err)
  330. }
  331. }