pub fn cut<I, O, E: ParseError<I>, F>(
parser: F,
) -> impl FnMut(I) -> IResult<I, O, E>where
F: Parser<I, O, E>,
Expand description
Transforms an Err::Error
(recoverable) to Err::Failure
(unrecoverable)
This commits the parse result, preventing alternative branch paths like with
nom::branch::alt
.
ยงExample
Without cut
:
fn parser(input: &str) -> IResult<&str, &str> {
alt((
preceded(one_of("+-"), digit1),
rest
))(input)
}
assert_eq!(parser("+10 ab"), Ok((" ab", "10")));
assert_eq!(parser("ab"), Ok(("", "ab")));
assert_eq!(parser("+"), Ok(("", "+")));
With cut
:
use nom::combinator::cut;
fn parser(input: &str) -> IResult<&str, &str> {
alt((
preceded(one_of("+-"), cut(digit1)),
rest
))(input)
}
assert_eq!(parser("+10 ab"), Ok((" ab", "10")));
assert_eq!(parser("ab"), Ok(("", "ab")));
assert_eq!(parser("+"), Err(Err::Failure(Error { input: "", code: ErrorKind::Digit })));