#enums #associated #constant #derive

macro no-std associated-derive

Derive macro for Associated

2 releases

0.1.1 Nov 13, 2021
0.1.0 Nov 12, 2021

#82 in #associated


Used in 2 crates (via associated)

MIT license

12KB
169 lines

associated-derive

Derive macro for Associated.

Usage

Add #[derive(Associated)] to an enum definition. This is not compatible with structs or unions.

When deriving Associated you must include a #[associate(Type = associated_type)] attribute beneath the #[derive(Associated)] attribute, replacing associated_type with the type of the constants you want to associate with the enum variants.

For each and every variant of the enum you must include either a #[assoc(expr)] or #[assoc_const(const_expr)] attribute above or inline before the variant, with expr or const_expr replaced with the expression or value you want to associate.

Example

#[derive(Associated)]
#[associated(Type = &'static str)]
enum Phonetic {
    #[assoc_const("Alpha")] Alpha,
    #[assoc(&"Bravo")] // #[assoc] requires an expression of type &'static Type
    Bravo = 3 // supports explicit enum discriminants
    // ...
}

Phonetic::Alpha.get_associated() // returns a static lifetime reference to "Alpha"

Generated Implementation

impl associated::Associated for Phonetic {
    type AssociatedType = &'static str;
    fn get_associated(&self) -> &'static Self::AssociatedType {
        match self {
            Phonetic::Alpha => {
                const ASSOCIATED: &'static str = "Alpha";
                &ASSOCIATED 
            },
            Phonetic::Bravo => &"Bravo",
        }
    }
}

Note

If you give a variant both an #[assoc] and an #[assoc_const] attribute, or multiple #[assoc] or #[assoc_const] attributes, only the first will be considered. Including more than one is not currently an error, but this will change so only use one #[assoc] or #[assoc_const] attribute per variant.

See associated for retrieving associated constants.

Dependencies

~1.5MB
~38K SLoC