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  }