Skip to content

Associated constants for Rust enums

License

Notifications You must be signed in to change notification settings

a-lafrance/soccer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

soccer

Associated constants for Rust enums

NOTE: Tests and documentation are very much still a work in progress for the time being

A Basic Example

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 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)

About

Associated constants for Rust enums

Resources

License

Stars

Watchers

Forks

Contributors