Function combine::choice [−][src]
pub fn choice<Input, P>(ps: P) -> Choice<P> where
Input: Stream,
P: ChoiceParser<Input>,
Expand description
Takes a tuple, a slice or an array of parsers and tries to apply them each in order. Fails if all the parsers fails or if an applied parser consumes input before failing.
// `choice` is overloaded on tuples so that different types of parsers can be used // (each parser must still have the same input and output types) let mut parser = choice(( string("Apple").map(|s| s.to_string()), many1(digit()), string("Orange").map(|s| s.to_string()), )); assert_eq!(parser.parse("1234"), Ok(("1234".to_string(), ""))); assert_eq!(parser.parse("Orangexx"), Ok(("Orange".to_string(), "xx"))); assert!(parser.parse("Appl").is_err()); assert!(parser.parse("Pear").is_err()); // If arrays or slices are used then all parsers must have the same type // (`string` in this case) let mut parser2 = choice([string("one"), string("two"), string("three")]); // Fails as the parser for "two" consumes the first 't' before failing assert!(parser2.parse("three").is_err()); // Use 'attempt' to make failing parsers always act as if they have not committed any input let mut parser3 = choice([attempt(string("one")), attempt(string("two")), attempt(string("three"))]); assert_eq!(parser3.parse("three"), Ok(("three", "")));