#[cfg(doc)]
use crate::TextParseErrorKind;
use crate::{TextParseError, TextScanner};
use crate::{unwrap, whilst};
impl<'a> TextScanner<'a> {
pub const fn take_ascii_u64(&mut self) -> Result<Option<u64>, TextParseError> {
let mut value = 0u64;
let mut saw_digit = false;
whilst! { let Some(byte) = self.peek_byte(); {
match byte {
b'0'..=b'9' => {
let digit = (byte - b'0') as u64;
let Some(v) = value.checked_mul(10) else {
return Err(TextParseError::overflow(self.cursor));
};
let Some(v) = v.checked_add(digit) else {
return Err(TextParseError::overflow(self.cursor));
};
value = v;
self._cursor_bump(1);
saw_digit = true;
}
_ => break,
}
}}
if saw_digit { Ok(Some(value)) } else { Ok(None) }
}
pub const fn expect_ascii_u64(&mut self) -> Result<u64, TextParseError> {
match unwrap![ok self.take_ascii_u64()] {
Some(value) => Ok(value),
None => Err(TextParseError::invalid_digit(self.cursor)),
}
}
}