optionally_const_macros 0.3.1

Proc-macro crate for optionally_const.
Documentation

Proc-macro crate for optionally_const

This crate exposes a FieldlessEnumConstType derive macro that generates a "const type" for a fieldless enum.

This allows you to parameterize the const type with the discriminants of the enum variants to represent them as const values.

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

#[derive(FieldlessEnumConstType, Debug)]
#[const_type(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 }>);

    let Some(_const_type_instance) = FieldlessEnum::A.try_into_const_type_instance::<{FieldlessEnum::A as usize}>() else {
        panic!("The conversion from a variant to a corresponding const type instance failed");
    };
}