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 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 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}