FieldlessEnumConstType

Derive Macro FieldlessEnumConstType 

Source
#[derive(FieldlessEnumConstType)]
{
    // Attributes available to this derive:
    #[const_type]
}
Available on crate feature derive only.
Expand description

Derives the const type for a fieldless enum as well as the implementations of the Const and OptionallyConst traits for the parameterizations of the const type that represent the enum variants.

The fieldless enum also must derive the [Clone] and [Copy] traits.

ยงExample

use optionally_const::OptionallyConst;
use optionally_const_macros::FieldlessEnumConstType;

// Clone, Copy, and PartialEq derives on the enum are required for the derive macro to work.
#[derive(FieldlessEnumConstType, Debug, Clone, Copy, PartialEq)]
#[const_type(
    // Clone, Copy, and PartialEq derives on the const type are required for the derive macro to work too
    #[derive(Clone, Copy, PartialEq)]
    ConstTypeName
)]
enum FieldlessEnum {
    A,
    B,
    C,
}

fn print_fieldless_enum<T>(value: T)
where
    T: OptionallyConst<FieldlessEnum>,
{
    if let Some(value) = T::MAYBE_CONST {
        println!("Const value: {:?}", value);
    } else {
        let value: FieldlessEnum = T::into_value(value);
        println!("Non-const value: {:?}", value);
    }
}

fn main() {
    print_fieldless_enum(FieldlessEnum::A);
    print_fieldless_enum(FieldlessEnum::B);
    print_fieldless_enum(FieldlessEnum::C);
    print_fieldless_enum(ConstTypeName::<{ FieldlessEnum::A as usize }>);
    print_fieldless_enum(ConstTypeName::<{ FieldlessEnum::B as usize }>);
    print_fieldless_enum(ConstTypeName::<{ FieldlessEnum::C as usize }>);
}