parseNext parses for the next JSON token. It returns a Token object for different types, except for Name. It does not handle whether the next token is in a valid sequence or not.
()
| 158 | // different types, except for Name. It does not handle whether the next token |
| 159 | // is in a valid sequence or not. |
| 160 | func (d *Decoder) parseNext() (Token, error) { |
| 161 | // Trim leading spaces. |
| 162 | d.consume(0) |
| 163 | |
| 164 | in := d.in |
| 165 | if len(in) == 0 { |
| 166 | return d.consumeToken(EOF, 0), nil |
| 167 | } |
| 168 | |
| 169 | switch in[0] { |
| 170 | case 'n': |
| 171 | if n := matchWithDelim("null", in); n != 0 { |
| 172 | return d.consumeToken(Null, n), nil |
| 173 | } |
| 174 | |
| 175 | case 't': |
| 176 | if n := matchWithDelim("true", in); n != 0 { |
| 177 | return d.consumeBoolToken(true, n), nil |
| 178 | } |
| 179 | |
| 180 | case 'f': |
| 181 | if n := matchWithDelim("false", in); n != 0 { |
| 182 | return d.consumeBoolToken(false, n), nil |
| 183 | } |
| 184 | |
| 185 | case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': |
| 186 | if n, ok := parseNumber(in); ok { |
| 187 | return d.consumeToken(Number, n), nil |
| 188 | } |
| 189 | |
| 190 | case '"': |
| 191 | s, n, err := d.parseString(in) |
| 192 | if err != nil { |
| 193 | return Token{}, err |
| 194 | } |
| 195 | return d.consumeStringToken(s, n), nil |
| 196 | |
| 197 | case '{': |
| 198 | return d.consumeToken(ObjectOpen, 1), nil |
| 199 | |
| 200 | case '}': |
| 201 | return d.consumeToken(ObjectClose, 1), nil |
| 202 | |
| 203 | case '[': |
| 204 | return d.consumeToken(ArrayOpen, 1), nil |
| 205 | |
| 206 | case ']': |
| 207 | return d.consumeToken(ArrayClose, 1), nil |
| 208 | |
| 209 | case ',': |
| 210 | return d.consumeToken(comma, 1), nil |
| 211 | } |
| 212 | return Token{}, d.newSyntaxError(d.currPos(), "invalid value %s", errRegexp.Find(in)) |
| 213 | } |
| 214 | |
| 215 | // newSyntaxError returns an error with line and column information useful for |
| 216 | // syntax errors. |
no test coverage detected