Crate parse_variants

source ·
Expand description

This crate allows us to parse tokens as one of the variants given by an enum. This is achieved by deriving the parse_variants::Parse trait on the enumeration which will in turn derive a syn::Parse implementation with the desired logic.

§Motivation

For a project, I was trying to parse tokens that could either be an integer literal or an identifier from a ParseBuffer. This inspired me to write a custom derive macro for these kinds of use cases. We can now write

#[derive(parse_variants::Parse)]
enum Number {
    Identifier(syn::Ident),
    Literal(syn::LitInt),
}

and then use this type to parse either variant from a parse buffer like so:

// input : &ParseBuffer
let num : Number = input.parse()?;

Parsing will return the first variant that can be parsed from the contents of the parse buffer. If none of the variants can be parsed, a compile error is returned. We can use this in any context where we wish to parse this type. The custom derive macro can also be used on much more general enum types, enabling pretty powerful parsing of variant types.

See the macro documentation for more use cases and some caveats.

Derive Macros§

  • A derive macro that allows us to parse a variant of an enumeration.