Added parser for signed integers.

Not used at the moment, but was simple to add while I was in the
headspace for it, and it will likely be useful in the future.
This commit is contained in:
Nathan Vegdahl 2019-11-23 10:41:19 +09:00
parent e23fe4bb36
commit df6aaeb527

View File

@ -4,10 +4,10 @@
use std::str::{self, FromStr};
use nom::{
character::complete::{digit1, multispace0},
combinator::map_res,
character::complete::{digit1, multispace0, one_of},
combinator::{map_res, opt, recognize},
number::complete::float,
sequence::delimited,
sequence::{delimited, tuple},
IResult,
};
@ -25,16 +25,16 @@ pub fn ws_usize(input: &str) -> IResult<&str, usize, ()> {
map_res(delimited(multispace0, digit1, multispace0), usize::from_str)(input)
}
// pub fn ws_i32(input: &str) -> IResult<&str, u32, ()> {
// map_res(
// delimited(
// multispace0,
// digit1,
// multispace0,
// ),
// u32::from_str,
// )(input)
// }
pub fn ws_i32(input: &str) -> IResult<&str, i32, ()> {
map_res(
delimited(
multispace0,
recognize(tuple((opt(one_of("-")), digit1))),
multispace0,
),
i32::from_str,
)(input)
}
// ========================================================
@ -61,6 +61,25 @@ mod test {
assert_eq!(ws_usize(" 42 53"), Ok((&"53"[..], 42)));
}
#[test]
fn ws_i32_1() {
assert_eq!(ws_i32("42"), Ok((&""[..], 42)));
assert_eq!(ws_i32(" 42"), Ok((&""[..], 42)));
assert_eq!(ws_i32("42 "), Ok((&""[..], 42)));
assert_eq!(ws_i32(" 42"), Ok((&""[..], 42)));
assert_eq!(ws_i32(" 42 53"), Ok((&"53"[..], 42)));
}
#[test]
fn ws_i32_2() {
assert_eq!(ws_i32("-42"), Ok((&""[..], -42)));
assert_eq!(ws_i32(" -42"), Ok((&""[..], -42)));
assert_eq!(ws_i32("-42 "), Ok((&""[..], -42)));
assert_eq!(ws_i32(" -42"), Ok((&""[..], -42)));
assert_eq!(ws_i32(" -42 53"), Ok((&"53"[..], -42)));
assert_eq!(ws_i32("--42").is_err(), true);
}
#[test]
fn ws_f32_1() {
assert_eq!(ws_f32("42"), Ok((&""[..], 42.0)));