Fix number parsing

This commit is contained in:
2023-12-04 16:41:56 +01:00
committed by Hannes Körber
parent feaf58b509
commit b15b9eb121

View File

@@ -18,16 +18,18 @@ mod parser {
use nom::{ use nom::{
branch::alt, branch::alt,
bytes::complete::take_while1, bytes::complete::take_while1,
character::complete::{char, digit1}, character::complete::{char, satisfy},
combinator::map, combinator::map,
multi::many_m_n, multi::count,
sequence::preceded, sequence::preceded,
IResult, IResult,
}; };
pub fn double_digit_number(i: &str) -> IResult<&str, usize> { pub fn double_digit_number(i: &str) -> IResult<&str, usize> {
let single_digit = preceded(char(' '), many_m_n(1, 1, digit1)); let digit = satisfy(|c| c.is_ascii_digit());
let double_digit = many_m_n(1, 1, digit1);
let single_digit = preceded(char(' '), count(&digit, 1));
let double_digit = count(&digit, 2);
let digit = alt((single_digit, double_digit)); let digit = alt((single_digit, double_digit));
@@ -56,8 +58,10 @@ mod parser {
#[test] #[test]
fn parse_double_digit() { fn parse_double_digit() {
assert_eq!(double_digit_number("23").unwrap(), ("", 23)); assert_eq!(double_digit_number("23").unwrap(), ("", 23));
assert_eq!(double_digit_number("234").unwrap(), ("4", 23));
assert_eq!(double_digit_number(" 234").unwrap(), ("34", 2));
assert_eq!(double_digit_number(" 3").unwrap(), ("", 3)); assert_eq!(double_digit_number(" 3").unwrap(), ("", 3));
assert_eq!(double_digit_number("3 ").unwrap(), (" ", 3)); assert_eq!(double_digit_number(" 3 ").unwrap(), (" ", 3));
assert!(double_digit_number(" 3").is_err()); assert!(double_digit_number(" 3").is_err());
} }