From e02dbc3577693a34b9f725164bab11cf754f1be5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Christian=20Gr=C3=BCnhage?= Date: Fri, 10 Dec 2021 08:14:16 +0100 Subject: [PATCH] add single digit parser --- src/parsing.rs | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) 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)); + } +}