github.com/RevenueMonster/sqlike@v1.0.6/jsonb/number.go (about) 1 package jsonb 2 3 import ( 4 "encoding/json" 5 "fmt" 6 ) 7 8 // Number : 9 type Number = json.Number 10 11 // ReadNumber : 12 func (r *Reader) ReadNumber() (Number, error) { 13 c := r.nextToken() 14 if c == 'n' { 15 if err := r.unreadByte().ReadNull(); err != nil { 16 return "", err 17 } 18 return "0", nil 19 } 20 21 if valueMap[c] != jsonNumber { 22 return "", ErrInvalidJSON{ 23 callback: "ReadNumber", 24 message: fmt.Sprintf("invalid character %q, expected number", c), 25 } 26 } 27 28 r.unreadByte() 29 str := string(r.b[r.pos:]) 30 pos := r.pos 31 for i := pos; i < r.len; i++ { 32 c = r.nextToken() 33 if c != '.' && c != 'e' && valueMap[c] != jsonNumber { 34 str = string(r.b[pos:i]) 35 r.pos = i 36 break 37 } 38 } 39 40 return json.Number(str), nil 41 } 42 43 func (r *Reader) skipNumber() { 44 c := r.nextToken() 45 if c == 'n' { 46 r.unreadByte().ReadNull() 47 return 48 } 49 50 for i := r.pos; i < r.len; i++ { 51 c = r.b[i] 52 switch c { 53 case ' ', '\n', '\r', '\t', ',', '}', ']': 54 r.pos = i 55 return 56 } 57 } 58 }