macro_rules! define_keywords {
    ($vis:vis mod $modname:ident { $($name:ident => $kw:ident;)* }) => { ... };
}
Expand description

Declares a module containing custom keywords as defined by custom_keyword!, and a Keywords marker type for CustomIdent implementing KeywordList.

define_keywords!{
    mod kw {
        Foo => foo;
        Bar => bar;
        Quux => quux;
    }
}

// Idiom for using `CustomIdent`
type MyIdent = CustomIdent<kw::Keywords>;

// Valid keywords in this language
let id_self: MyIdent = "self".parse()?;
assert_eq!(id_self, "self");

let id_async: MyIdent = "async".parse()?;
assert_eq!(id_async, "async");

let id_baz: MyIdent = "baz".parse()?;
assert_eq!(id_baz, "baz");

let id_multi_part: MyIdent = "multi_part".parse()?;
assert_eq!(id_multi_part, "multi_part");

let _: kw::Bar = "bar".parse()?;

// Invalid keywords
let invalid: Result<MyIdent> = "quux".parse();
assert_eq!(
    invalid.unwrap_err().to_string(),
    "expected identifier, found keyword",
);

let invalid_quux: Result<kw::Quux> = "somethingelse".parse();
assert_eq!(
    invalid_quux.unwrap_err().to_string(),
    "expected keyword `quux`",
);