Macro parsable_enum

Source
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));