nom7/
nom7.rs

1use nom7::branch::alt;
2use nom7::character::complete::{alpha1, digit1};
3use nom7::error::{ErrorKind, ParseError, VerboseError};
4use nom7::sequence::tuple;
5use nom7::Err::Error;
6use nom7::IResult;
7use nom_greedyerror::{error_position, GreedyError, Position};
8use nom_locate4::LocatedSpan;
9
10type Span<'a> = LocatedSpan<&'a str>;
11
12fn parser<'a, E: ParseError<Span<'a>>>(
13    input: Span<'a>,
14) -> IResult<Span<'a>, (Span<'a>, Span<'a>, Span<'a>), E> {
15    alt((
16        tuple((alpha1, digit1, alpha1)),
17        tuple((digit1, alpha1, digit1)),
18    ))(input)
19}
20
21fn main() {
22    // VerboseError failed at
23    //   abc012:::
24    //   ^
25    let error = parser::<VerboseError<Span>>(Span::new("abc012:::"));
26    dbg!(&error);
27    match error {
28        Err(Error(e)) => assert_eq!(e.errors.first().map(|x| x.0.position()), Some(0)),
29        _ => (),
30    };
31
32    // GreedyError failed at
33    //   abc012:::
34    //         ^
35    let error = parser::<GreedyError<Span, ErrorKind>>(Span::new("abc012:::"));
36    dbg!(&error);
37    match error {
38        Err(Error(e)) => assert_eq!(error_position(&e), Some(6)),
39        _ => (),
40    };
41}