1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
use crate::*; pub struct NaturalNumber; impl<Iter> Parser<Iter> for NaturalNumber where Iter: Iterator<Item = char> + Clone, { type Output = u128; fn parse(&self, mut i: Iter) -> Option<(Iter, Self::Output)> { let mut val = None; while let Some(x) = i.clone().next() { let x = match x { '0' => 0, '1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5, '6' => 6, '7' => 7, '8' => 8, '9' => 9, _ => break, }; val = val.or(Some(0)).map(|o| o * 10 + x); i.next(); } Some((i, val?)) } } #[cfg(test)] mod tests { use crate::prelude::*; #[test] fn positive() { assert_eq!( crate::str::NaturalNumber.parse_str("1234500b"), Some(("b", 1234500)) ) } #[test] fn negative() { assert_eq!(crate::str::NaturalNumber.parse_str("b1234500"), None) } }