Crates.io | soccer |
lib.rs | soccer |
version | 0.0.1 |
source | src |
created_at | 2023-07-18 23:37:21.293626 |
updated_at | 2023-07-18 23:37:21.293626 |
description | Associated constants for enums |
homepage | |
repository | https://github.com/a-lafrance/soccer |
max_upload_size | |
id | 919863 |
size | 19,721 |
Associated constants for Rust enums
NOTE: Tests and documentation are very much still a work in progress for the time being
soccer
can generate code to make treating a fieldless enum as a discrete set of constants easier by deriving TryFrom
, Into
, and Display
:
#[derive(Clone, Copy, PartialEq, Eq, TryFrom, Into, Display)]
#[const_ty(char)]
enum Punctuation {
Plus,
Minus,
Star,
Equals,
}
fn main() {
assert_eq!(Punctuation::try_from('+'), Ok(Punctuation::Plus));
let val: char = Punctuation::Star.into();
assert_eq!(val, '*');
println!("{}", Punctuation::Minus); // prints "-"
}
It can also use the discriminant to do this:
#[derive(Clone, Copy, PartialEq, Eq, TryFrom, Into, Display)]
#[repr(u8)]
enum Opcode {
Add,
Sub,
Mul,
Load,
Store,
}
fn main() {
assert_eq!(Opcode::try_from(0), Ok(Opcode::Add));
let val: u8 = Opcode::Load.into();
assert_eq!(val, 3);
println!("{}", Opcode::Store); // prints "4"
}
Those are both actual use cases I've encountered in my own Rust projects that motivated the creation of this crate.
(I used to maintain the https://github.com/a-lafrance/discrim crate for this discriminant-based conversion codegen, but since it got absorbed into soccer
I've archived it and don't work on it anymore)