Attribute Macro enumber::convert [−][src]
#[convert]
Expand description
Convert an enumber
compliant enum into a proper enum with
appropriate associated traits.
As an example, you might have the following enum definition:
#[enumber::convert] enum Ordinals { First = 1, Second = 2, Third = 3, TheRest(u16), }
Normally that enum would be invalid because of the combination of both explicit discriminants, and a tuple-style variant. The conversion will strip the discriminants off the enumeration and then implement conversions to/from the number type of the tuple-style variant.
In addition, implementations of Display
and
FromStr
will be automatically provided. The error
type for the FromStr
implementation will be named Parse${NAME}Error
and will have the same visibility specifier as your enum had.
The error enumeration will look like this:
enum ParseOrdinalsError { UnknownName(String), UnknownValue(u16) }
Naturally the integer type in the UnknownValue
variant will be that of the
enum’s tuple-style variant.
If you do not wish to have an “other” variant, then you can omit it, in which case you must specify the representation of the enumeration explicitly:
#[enumber::convert] #[repr(u8)] enum AccessLevel { Guest = 0, Member = 1, Developer = 2, Owner = 3, }
In this case, From<${TYPE}>
will not be implemented, and instead there
will be an implementation of TryFrom<${TYPE}>
where the error type for
that conversion is simply the input number type.
You may specify variants as taking a range rather than a fixed value, and if you do, then the variant will be converted into a tuple type automatically, in order to hold the exact value given during conversion. As with the above examples, if you do not also specify a default variant then you will have to specify the relevant integer representation.
Finally, if you are certain that your given values (or ranges) cover all
possible input values to the conversion functions, and you wish to omit the
default variant, then you can specify #[exhaustive]
on the enumeration and
enumber
will create a From<${TYPE}>
impl despite the lack of the default
variant. Of course, if your values are not exhaustive then the compiler will
flag an error and not continue.
#[enumber::convert] #[exhaustive] #[repr(u8)] enum Age { Child = 0..=12, Teenager = 13..=19, Adult = 20..=65, Pensioner = 66..=254, // Not quite enough, so this will fail to compile }