macro_rules! parsable_enum {
(
$(#[$($enum_meta:tt)+])*
enum $name:ident {$(
$(#[$meta:meta])*
$($l:literal)|+ => $variant:ident $(= $value:expr)?,
)+}
) => { ... };
}Expand description
Macro to define an enumerable enum that implements Parseable.
The parser is implemented using parser::literal_map! and
enumerable_enum!.
ยงExamples
parser::parsable_enum! {
#[derive(Debug, PartialEq, Default)]
enum Direction {
#[default]
"north" | "n" => North,
"south" | "s" => South,
"east" | "e" => East,
"west" | "w" => West,
}
}
assert_eq!(Direction::PARSER.parse(b"north"), Ok((Direction::North, &b""[..])));
assert_eq!(Direction::PARSER.parse(b"s"), Ok((Direction::South, &b""[..])));
assert!(Direction::PARSER.parse(b"a").is_err());
assert_eq!(Direction::COUNT, 4);With discriminant helpers (requires an explicit #[repr(...)] attribute first):
parser::parsable_enum! {
#[repr(u8)]
#[derive(Debug, PartialEq)]
enum Operation {
"add" => Add,
"mul" => Mul,
"div" => Div,
"mod" => Mod,
"eql" => Eql,
}
}
assert_eq!(Operation::PARSER.parse(b"add5"), Ok((Operation::Add, &b"5"[..])));
assert_eq!(Operation::PARSER.parse(b"eql"), Ok((Operation::Eql, &b""[..])));
assert_eq!(Operation::COUNT, 5);
assert_eq!(Operation::checked_from_discriminant(2), Some(Operation::Div));