Derive Macro strum_macros::EnumDiscriminants[][src]

#[derive(EnumDiscriminants)]
{
    // Attributes available to this derive:
    #[strum]
    #[strum_discriminants]
}

Generate a new type with only the discriminant names.

Given an enum named MyEnum, generates another enum called MyEnumDiscriminants with the same variants, without any data fields. This is useful when you wish to determine the variant of an enum from a String, but the variants contain any non-Default fields. By default, the generated enum has the following derives: Clone, Copy, Debug, PartialEq, Eq. You can add additional derives using the #[strum_discriminants(derive(AdditionalDerive))] attribute.

// Bring trait into scope
use std::str::FromStr;
use strum::IntoEnumIterator;
use strum_macros::{EnumDiscriminants, EnumIter, EnumString};

#[derive(Debug)]
struct NonDefault;

// simple example
#[derive(Debug, EnumDiscriminants)]
#[strum_discriminants(derive(EnumString))]
enum MyEnum {
    Variant0(NonDefault),
    Variant1 { a: NonDefault },
}

// You can rename the generated enum using the `#[strum_discriminants(name(OtherName))]` attribute:
#[derive(Debug, EnumDiscriminants)]
#[strum_discriminants(derive(EnumIter))]
#[strum_discriminants(name(MyVariants))]
enum MyEnumR {
    Variant0(bool),
    Variant1 { a: bool },
}

// test simple example
assert_eq!(
    MyEnumDiscriminants::Variant0,
    MyEnumDiscriminants::from_str("Variant0").unwrap()
);
// test rename example combined with EnumIter
assert_eq!(
    vec![MyVariants::Variant0, MyVariants::Variant1],
    MyVariants::iter().collect::<Vec<_>>()
);

It is also possible to specify the visibility (e.g. pub/pub(crate)/etc.) of the generated enum. By default, the generated enum inherits the visibility of the parent enum it was generated from.

use strum_macros::EnumDiscriminants;

// You can set the visibility of the generated enum using the `#[strum_discriminants(vis(..))]` attribute:
mod inner {
    use strum_macros::EnumDiscriminants;

    # #[allow(dead_code)]
    #[derive(Debug, EnumDiscriminants)]
    #[strum_discriminants(vis(pub))]
    #[strum_discriminants(name(PubDiscriminants))]
    enum PrivateEnum {
        Variant0(bool),
        Variant1 { a: bool },
    }
}

// test visibility example, `PrivateEnum` should not be accessible here
assert_ne!(
    inner::PubDiscriminants::Variant0,
    inner::PubDiscriminants::Variant1,
);