devela::_dep::winnow::combinator

Function alt

pub fn alt<Input, Output, Error, Alternatives>(
    alternatives: Alternatives,
) -> impl Parser<Input, Output, Error>
where Input: Stream, Alternatives: Alt<Input, Output, Error>, Error: ParserError<Input>,
Available on crate feature dep_winnow only.
Expand description

Pick the first successful parser

To stop on an error, rather than trying further cases, see cut_err ([example][crate::_tutorial::chapter_7]).

For tight control over the error when no match is found, add a final case using fail. Alternatively, with a [custom error type][crate::_topic::error], it is possible to track all errors or return the error of the parser that went the farthest in the input data.

When the alternative cases have unique prefixes, [dispatch] can offer better performance.

ยงExample

use winnow::ascii::{alpha1, digit1};
use winnow::combinator::alt;
fn parser(input: &str) -> IResult<&str, &str> {
  alt((alpha1, digit1)).parse_peek(input)
};

// the first parser, alpha1, takes the input
assert_eq!(parser("abc"), Ok(("", "abc")));

// the first parser returns an error, so alt tries the second one
assert_eq!(parser("123456"), Ok(("", "123456")));

// both parsers failed, and with the default error type, alt will return the last error
assert_eq!(parser(" "), Err(ErrMode::Backtrack(InputError::new(" ", ErrorKind::Slice))));