Parse an optionally-signed integer starting at `offset` in `sql`, skipping leading whitespace. Returns `(value, end_offset_exclusive)`.
(sql: &str, offset: usize)
| 403 | /// Parse an optionally-signed integer starting at `offset` in `sql`, skipping |
| 404 | /// leading whitespace. Returns `(value, end_offset_exclusive)`. |
| 405 | fn parse_trailing_i64(sql: &str, offset: usize) -> Result<(i64, usize), TemporalParseError> { |
| 406 | let rest = &sql[offset..]; |
| 407 | let trimmed = rest.trim_start(); |
| 408 | let leading = rest.len() - trimmed.len(); |
| 409 | let end_rel = trimmed |
| 410 | .char_indices() |
| 411 | .take_while(|(i, c)| c.is_ascii_digit() || (*i == 0 && *c == '-')) |
| 412 | .map(|(i, c)| i + c.len_utf8()) |
| 413 | .last() |
| 414 | .ok_or_else(|| TemporalParseError(format!("expected integer at offset {offset}")))?; |
| 415 | let num_str = &trimmed[..end_rel]; |
| 416 | let v: i64 = num_str |
| 417 | .parse() |
| 418 | .map_err(|_| TemporalParseError(format!("not an i64: {num_str}")))?; |
| 419 | Ok((v, offset + leading + end_rel)) |
| 420 | } |
| 421 | |
| 422 | #[cfg(test)] |
| 423 | mod tests { |
no test coverage detected