Create enums with a constant value associated to every variant.
.value()
method or via the
From
/ Into
Traits#[...]
) and documentation are automatically added to the generated enum```rust value_enum! { enum Fruit: &'static str { Apple = "red", Banana = "yellow", Pear = "green" } }
// Get the value with the .value()
method:
let apple = Fruit::Apple;
println!("Apple: {}", apple.value()); // Apple: red
// Get the value with the From / Into traits: let pear = Fruit::Pear; let value: &str = pear.into(); println!("Pear: {}", value); // Pear: green ```
Note:
The type of the values must be specified after the enum name, just like above (&'static str
in this case).
Note:
If the value type is a reference (&
) or contains references, the
'static
lifetime must be used,\
otherwise the Rust compiler would not know where the value is borrowed from.
```rust value_enum! { #[derive(Debug)] enum Color: u8 { Red = 1, Green = 2, Yellow = 3 } }
let red = Color::Red; println!("{:?}: {}", red, red.value()); // Red: 1
let yellow = Color::Yellow; let value: u8 = yellow.into(); println!("Yellow: {}", value); // Yellow: 3 ```
Note:
If you want more traits implemented for your enum, you have to do it yourself.\
In the example above, the
Debug
trait is derived.
Note:
Only constant expressions are allowed to the right of the equals sign,\
which means they must be evaluable at compile time.\
Look here for all kinds of constant expressions: https://doc.rust-lang.org/reference/const_eval.html#constant-expressions
Easy, but you can't:
Example of using simple constants:
```rust const RED: u8 = 1; const GREEN: u8 = 2; const YELLOW: u8 = 3;
fn display_color(color: u8) { }
displaycolor(RED); displaycolor(GREEN);
// But also accepts other u8
values:
display_color(42);
```
You could additionally:
``rust
type Color = u8;
//
Coloris now an alias for
u8`
fn display_color(color: Color) { }
display_color(RED);
// Note: Because Color
is only an alias and not a new type,
// you can still use any other u8
value:
display_color(42);
```
Color::RED
:rust
mod Color {
const RED: u8 = 1;
// ...
}
Example of using an enum with disciminators:
```rust enum Color { Red = 1, Green = 2, Yellow = 3 }
fn displaycolor(color: Color) {
// Now cast to any integer type via as
:
takesu8(color as u8);
takes_i32(color as i32);
}
display_color(Color::Yellow); ```
You could additionally:
rust
impl Color {
fn value(&self) -> u8 {
self as u8
}
}
// ...
takes_u8(color.value())
// ...
This is exactly what this library does automatically.\
Example of manually converting from enum variant to value:
```rust enum Color { Red, Green, Yellow }
impl Color { const fn value(&self) -> u8 { const RED: u8 = 1; const GREEN: u8 = 2; const YELLOW: u8 = 3; match self { Color::Red => RED, Color::Green => GREEN, Color::Yelllow => YELLOW } } }
display_color(Color::Yellow);
fn displaycolor(color: Color) {
// Now cast to any integer type via as
:
takesu8(color as u8);
takes_i32(color as i32);
}
```
Note:
Apart from generating a method like this, this libarary generates documentation and a
From
implementation.\
Look at the beginning of the file for more information.
Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.