Crates.io | vnum |
lib.rs | vnum |
version | 0.1.0 |
source | src |
created_at | 2022-08-27 22:15:57.852694 |
updated_at | 2022-08-27 22:15:57.852694 |
description | Create enums with a constant value associated to every variant |
homepage | |
repository | https://github.com/lightningyx/vnum |
max_upload_size | |
id | 653632 |
size | 83,917 |
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 enumvalue_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.
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:
const RED: u8 = 1;
const GREEN: u8 = 2;
const YELLOW: u8 = 3;
fn display_color(color: u8) { }
display_color(RED);
display_color(GREEN);
// But also accepts other `u8` values:
display_color(42);
You could additionally:
Create a type alias to improve readability:
type Color = u8;
// `Color` is 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);
Put the constants in an own module to use them like Color::RED
:
mod Color {
const RED: u8 = 1;
// ...
}
&str
example from above.as
.Example of using an enum with disciminators:
enum Color {
Red = 1,
Green = 2,
Yellow = 3
}
fn display_color(color: Color) {
// Now cast to any integer type via `as`:
takes_u8(color as u8);
takes_i32(color as i32);
}
display_color(Color::Yellow);
You could additionally:
Create a method to get the value:
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:
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 display_color(color: Color) {
// Now cast to any integer type via `as`:
takes_u8(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.