| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358 |
- package jsoniter
- import (
- fflib "github.com/pquerna/ffjson/fflib/v1"
- "strconv"
- "fmt"
- )
- type Token fflib.FFTok
- const TokenInteger = Token(fflib.FFTok_integer)
- const TokenDouble = Token(fflib.FFTok_double)
- const TokenBool = Token(fflib.FFTok_bool)
- const TokenError = Token(fflib.FFTok_error)
- const TokenLeftBrace = Token(fflib.FFTok_left_brace)
- const TokenLeftBracket = Token(fflib.FFTok_left_bracket)
- const TokenRightBrace = Token(fflib.FFTok_right_brace)
- const TokenRightBracket = Token(fflib.FFTok_right_bracket)
- const TokenComma = Token(fflib.FFTok_comma)
- const TokenString = Token(fflib.FFTok_string)
- const TokenColon = Token(fflib.FFTok_colon)
- func (tok Token) ToString() string {
- return fmt.Sprintf("%v", fflib.FFTok(tok))
- }
- type Iterator struct {
- ErrorHandler func(error)
- lexer *fflib.FFLexer
- }
- type UnexpectedToken struct {
- Expected Token
- Actual Token
- }
- func (err *UnexpectedToken) Error() string {
- return fmt.Sprintf("unexpected token, expected %v, actual %v", fflib.FFTok(err.Expected), fflib.FFTok(err.Actual))
- }
- func NewIterator(input []byte) Iterator {
- lexer := fflib.NewFFLexer(input)
- return Iterator{
- lexer: lexer,
- }
- }
- func (iter Iterator) ReadArray(callback func(Iterator, int)) {
- lexer := iter.lexer
- if !iter.AssertToken(TokenLeftBrace) {
- return
- }
- index := 0
- for {
- lexer.Scan()
- callback(iter, index)
- index += 1
- if iter.Token() != TokenComma {
- break
- }
- }
- iter.AssertToken(TokenRightBrace)
- lexer.Scan()
- }
- func (iter Iterator) ReadObject(callback func(Iterator, string)) {
- lexer := iter.lexer
- if !iter.AssertToken(TokenLeftBracket) {
- return
- }
- for {
- lexer.Scan()
- field := iter.ReadString()
- iter.AssertToken(TokenColon)
- lexer.Scan()
- callback(iter, field)
- if iter.Token() != TokenComma {
- break
- }
- }
- iter.AssertToken(TokenRightBracket)
- lexer.Scan()
- }
- func (iter Iterator) Skip() {
- switch iter.Token() {
- case TokenLeftBracket:
- iter.ReadObject(func(iter Iterator, field string) {
- iter.Skip()
- })
- case TokenLeftBrace:
- iter.ReadArray(func(iter Iterator, index int) {
- iter.Skip()
- })
- default:
- iter.lexer.Scan()
- }
- }
- func (iter Iterator) ReadInt8() (rval int8) {
- lexer := iter.lexer
- if !iter.AssertToken(TokenInteger) {
- return
- }
- field, err := lexer.CaptureField(lexer.Token)
- if err != nil {
- iter.OnError(err)
- return
- }
- lexer.Scan()
- number, err := strconv.ParseInt(string(field), 10, 8)
- if err != nil {
- iter.OnError(fmt.Errorf("failed to convert %v: %v", string(field), err.Error()))
- return
- }
- return int8(number)
- }
- func (iter Iterator) ReadInt16() (rval int16) {
- lexer := iter.lexer
- if !iter.AssertToken(TokenInteger) {
- return
- }
- field, err := lexer.CaptureField(lexer.Token)
- if err != nil {
- iter.OnError(err)
- return
- }
- lexer.Scan()
- number, err := strconv.ParseInt(string(field), 10, 16)
- if err != nil {
- iter.OnError(fmt.Errorf("failed to convert %v: %v", string(field), err.Error()))
- return
- }
- return int16(number)
- }
- func (iter Iterator) ReadInt32() (rval int32) {
- lexer := iter.lexer
- if !iter.AssertToken(TokenInteger) {
- return
- }
- field, err := lexer.CaptureField(lexer.Token)
- if err != nil {
- iter.OnError(err)
- return
- }
- lexer.Scan()
- number, err := strconv.ParseInt(string(field), 10, 32)
- if err != nil {
- iter.OnError(fmt.Errorf("failed to convert %v: %v", string(field), err.Error()))
- return
- }
- return int32(number)
- }
- func (iter Iterator) ReadInt64() (rval int64) {
- lexer := iter.lexer
- if !iter.AssertToken(TokenInteger) {
- return
- }
- field, err := lexer.CaptureField(lexer.Token)
- if err != nil {
- iter.OnError(err)
- return
- }
- lexer.Scan()
- number, err := strconv.ParseInt(string(field), 10, 64)
- if err != nil {
- iter.OnError(fmt.Errorf("failed to convert %v: %v", string(field), err.Error()))
- return
- }
- return number
- }
- func (iter Iterator) ReadInt() (rval int) {
- lexer := iter.lexer
- n, err := lexer.LexInt64()
- if err != nil {
- iter.OnError(err)
- return
- }
- return int(n)
- }
- func (iter Iterator) ReadUint() (rval uint) {
- lexer := iter.lexer
- if !iter.AssertToken(TokenInteger) {
- return
- }
- field, err := lexer.CaptureField(lexer.Token)
- if err != nil {
- iter.OnError(err)
- return
- }
- lexer.Scan()
- number, err := strconv.ParseUint(string(field), 10, 64)
- if err != nil {
- iter.OnError(fmt.Errorf("failed to convert %v: %v", string(field), err.Error()))
- return
- }
- return uint(number)
- }
- func (iter Iterator) ReadUint8() (rval uint8) {
- lexer := iter.lexer
- if !iter.AssertToken(TokenInteger) {
- return
- }
- field, err := lexer.CaptureField(lexer.Token)
- if err != nil {
- iter.OnError(err)
- return
- }
- lexer.Scan()
- number, err := strconv.ParseUint(string(field), 10, 8)
- if err != nil {
- iter.OnError(fmt.Errorf("failed to convert %v: %v", string(field), err.Error()))
- return
- }
- return uint8(number)
- }
- func (iter Iterator) ReadUint16() (rval uint16) {
- lexer := iter.lexer
- if !iter.AssertToken(TokenInteger) {
- return
- }
- field, err := lexer.CaptureField(lexer.Token)
- if err != nil {
- iter.OnError(err)
- return
- }
- lexer.Scan()
- number, err := strconv.ParseUint(string(field), 10, 16)
- if err != nil {
- iter.OnError(fmt.Errorf("failed to convert %v: %v", string(field), err.Error()))
- return
- }
- return uint16(number)
- }
- func (iter Iterator) ReadUint32() (rval uint32) {
- lexer := iter.lexer
- if !iter.AssertToken(TokenInteger) {
- return
- }
- field, err := lexer.CaptureField(lexer.Token)
- if err != nil {
- iter.OnError(err)
- return
- }
- lexer.Scan()
- number, err := strconv.ParseUint(string(field), 10, 32)
- if err != nil {
- iter.OnError(fmt.Errorf("failed to convert %v: %v", string(field), err.Error()))
- return
- }
- return uint32(number)
- }
- func (iter Iterator) ReadUint64() (rval uint64) {
- lexer := iter.lexer
- if !iter.AssertToken(TokenInteger) {
- return
- }
- field, err := lexer.CaptureField(lexer.Token)
- if err != nil {
- iter.OnError(err)
- return
- }
- lexer.Scan()
- number, err := strconv.ParseUint(string(field), 10, 64)
- if err != nil {
- iter.OnError(fmt.Errorf("failed to convert %v: %v", string(field), err.Error()))
- return
- }
- return uint64(number)
- }
- func (iter Iterator) ReadFloat32() (rval float32) {
- lexer := iter.lexer
- if !iter.AssertToken(TokenDouble) {
- return
- }
- field, err := lexer.CaptureField(lexer.Token)
- if err != nil {
- iter.OnError(err)
- return
- }
- lexer.Scan()
- number, err := strconv.ParseFloat(string(field), 32)
- if err != nil {
- iter.OnError(fmt.Errorf("failed to convert %v: %v", string(field), err.Error()))
- return
- }
- return float32(number)
- }
- func (iter Iterator) ReadFloat64() (rval float64) {
- lexer := iter.lexer
- if !iter.AssertToken(TokenDouble) {
- return
- }
- field, err := lexer.CaptureField(lexer.Token)
- if err != nil {
- iter.OnError(err)
- return
- }
- lexer.Scan()
- number, err := strconv.ParseFloat(string(field), 64)
- if err != nil {
- iter.OnError(fmt.Errorf("failed to convert %v: %v", string(field), err.Error()))
- return
- }
- return float64(number)
- }
- func (iter Iterator) ReadString() (rval string) {
- lexer := iter.lexer
- if !iter.AssertToken(TokenString) {
- return
- }
- field, err := lexer.CaptureField(lexer.Token)
- if err != nil {
- iter.OnError(err)
- return
- }
- lexer.Scan()
- return string(field[1:len(field) - 1])
- }
- func (iter Iterator) AssertToken(expected Token) bool {
- actual := iter.Token()
- if expected != actual {
- if actual == TokenError {
- fmt.Println(iter.lexer.BigError.Error())
- }
- iter.OnError(&UnexpectedToken{
- Expected: expected,
- Actual: actual,
- })
- return false
- }
- return true
- }
- func (iter Iterator) Token() Token {
- return Token(iter.lexer.Token)
- }
- func (iter *Iterator) OnError(err error) {
- if iter.ErrorHandler == nil {
- panic(err.Error())
- } else {
- iter.ErrorHandler(err)
- }
- }
|