diff --git a/src/parsing.rs b/src/parsing.rs index 05bc145..aea66a0 100644 --- a/src/parsing.rs +++ b/src/parsing.rs @@ -9,18 +9,43 @@ pub fn newline(tokens: &mut impl Tokens) -> bool { } pub fn parse_number(tokens: &mut impl Tokens) -> Option { - parse_number_with_radix(tokens, 10) + parse_number_with_radix(tokens, 10, None) +} + +pub fn parse_digit(tokens: &mut impl Tokens) -> Option { + parse_number_with_radix(tokens, 10, Some(1)) } pub fn parse_number_with_radix( tokens: &mut impl Tokens, base: u32, + limit: Option, ) -> Option { tokens.skip_tokens_while(|t| *t == ' '); - let digits: String = tokens.tokens_while(|c| c.is_digit(base)).collect(); + let mut remaining = limit.map(|x| x as isize).unwrap_or(isize::MAX); + let digits: String = tokens + .tokens_while(|c| { + remaining -= 1; + c.is_digit(base) && remaining >= 0 + }) + .collect(); if !digits.is_empty() { T::from_str_radix(&digits, base).ok() } else { None } } + +#[cfg(test)] +mod test { + use yap::IntoTokens; + + #[test] + fn parse_digit() { + let mut tokens = "1234".into_tokens(); + assert_eq!(Some(1), super::parse_digit(&mut tokens)); + assert_eq!(Some(2), super::parse_digit(&mut tokens)); + assert_eq!(Some(3), super::parse_digit(&mut tokens)); + assert_eq!(Some(4), super::parse_digit(&mut tokens)); + } +}