(b []byte)
| 286 | } |
| 287 | |
| 288 | func (d decoder) parseNumber(b []byte) (v, r []byte, kind Kind, err error) { |
| 289 | if len(b) == 0 { |
| 290 | r, err = b, unexpectedEOF(b) |
| 291 | return |
| 292 | } |
| 293 | |
| 294 | // Assume it's an unsigned integer at first. |
| 295 | kind = Uint |
| 296 | |
| 297 | i := 0 |
| 298 | // sign |
| 299 | if b[i] == '-' { |
| 300 | kind = Int |
| 301 | i++ |
| 302 | } |
| 303 | |
| 304 | if i == len(b) { |
| 305 | r, err = b[i:], syntaxError(b, "missing number value after sign") |
| 306 | return |
| 307 | } |
| 308 | |
| 309 | if b[i] < '0' || b[i] > '9' { |
| 310 | r, err = b[i:], syntaxError(b, "expected digit but got '%c'", b[i]) |
| 311 | return |
| 312 | } |
| 313 | |
| 314 | // integer part |
| 315 | if b[i] == '0' { |
| 316 | i++ |
| 317 | if i == len(b) || (b[i] != '.' && b[i] != 'e' && b[i] != 'E') { |
| 318 | v, r = b[:i], b[i:] |
| 319 | return |
| 320 | } |
| 321 | if '0' <= b[i] && b[i] <= '9' { |
| 322 | r, err = b[i:], syntaxError(b, "cannot decode number with leading '0' character") |
| 323 | return |
| 324 | } |
| 325 | } |
| 326 | |
| 327 | for i < len(b) && '0' <= b[i] && b[i] <= '9' { |
| 328 | i++ |
| 329 | } |
| 330 | |
| 331 | // decimal part |
| 332 | if i < len(b) && b[i] == '.' { |
| 333 | kind = Float |
| 334 | i++ |
| 335 | decimalStart := i |
| 336 | |
| 337 | for i < len(b) { |
| 338 | if c := b[i]; '0' > c || c > '9' { |
| 339 | if i == decimalStart { |
| 340 | r, err = b[i:], syntaxError(b, "expected digit but found '%c'", c) |
| 341 | return |
| 342 | } |
| 343 | break |
| 344 | } |
| 345 | i++ |
no test coverage detected