winnow::combinator

Function alt

Source
pub fn alt<Input: Stream, Output, Error, Alternatives>(
    alternatives: Alternatives,
) -> impl Parser<Input, Output, Error>
where Alternatives: Alt<Input, Output, Error>, Error: ParserError<Input>,
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))));