pub fn one_of<'i, L: ParserOneOfTuple<'i>>(options: L) -> OneOf<L>Expand description
Parser which tries a list of parsers in order until one succeeds.
If a parser commits, no further parsers are tried.
This is similar to Parser::or but supports a variable number of parsers.
Prefer parser::literal_map if all the parsers are string literals.
ยงExamples
#[derive(Debug, PartialEq)]
enum Value {
Unsigned8(u8),
Unsigned32(u32),
Signed8(i8),
Signed32(i32),
}
let parser = parser::one_of((
parser::u8().map(Value::Unsigned8),
parser::u32().map(Value::Unsigned32),
parser::i8().map(Value::Signed8),
parser::i32().map(Value::Signed32),
));
assert_eq!(
parser.parse_complete("31").unwrap(),
Value::Unsigned8(31),
);
assert_eq!(
parser.parse_complete("4294967295").unwrap(),
Value::Unsigned32(4294967295),
);
assert_eq!(
parser.parse_complete("-1").unwrap(),
Value::Signed8(-1)
);
assert_eq!(
parser.parse_complete("-2147483648").unwrap(),
Value::Signed32(-2147483648)
);
assert_eq!(
parser.parse_complete("not a number").unwrap_err().into_source(),
ParseError::Expected("unsigned integer")
);
assert_eq!(
parser.parse_complete("-4294967295").unwrap_err().into_source(),
ParseError::NumberTooSmall(-2147483648)
);