Crates.io | enumnvictorhowisers |
lib.rs | enumnvictorhowisers |
version | 0.1.13 |
source | src |
created_at | 2024-03-01 18:39:17.093883 |
updated_at | 2024-03-01 18:39:17.093883 |
description | Convert number to enum |
homepage | |
repository | https://github.com/victorhowisers/enumn |
max_upload_size | |
id | 1159150 |
size | 25,029 |
This crate provides a derive macro to generate a function for converting a primitive integer into the corresponding variant of an enum.
The generated function is named n
and has the following signature:
impl YourEnum {
pub fn n(value: Repr) -> Option<Self>;
}
where Repr
is an integer type of the right size as described in more
detail below.
use enumn::N;
#[derive(PartialEq, Debug, N)]
enum Status {
LegendaryTriumph,
QualifiedSuccess,
FortuitousRevival,
IndeterminateStalemate,
RecoverableSetback,
DireMisadventure,
AbjectFailure,
}
fn main() {
let s = Status::n(1);
assert_eq!(s, Some(Status::QualifiedSuccess));
let s = Status::n(9);
assert_eq!(s, None);
}
The generated signature depends on whether the enum has a #[repr(..)]
attribute. If a repr
is specified, the input to n
will be required to be
of that type.
#[derive(enumn::N)]
#[repr(u8)]
enum E {
/* ... */
}
// expands to:
impl E {
pub fn n(value: u8) -> Option<Self> {
/* ... */
}
}
On the other hand if no repr
is specified then we get a signature that is
generic over a variety of possible types.
impl E {
pub fn n<REPR: Into<i64>>(value: REPR) -> Option<Self> {
/* ... */
}
}
The conversion respects explictly specified enum discriminants. Consider this enum:
#[derive(enumn::N)]
enum Letter {
A = 65,
B = 66,
}
Here Letter::n(65)
would return Some(Letter::A)
.