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:

```rust

[derive(Clone, Copy, PartialEq, Eq, TryFrom, Into, Display)]

[const_ty(char)]

enum Punctuation { Plus, Minus, Star, Equals, }

fn main() { asserteq!(Punctuation::tryfrom('+'), 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:

```rust

[derive(Clone, Copy, PartialEq, Eq, TryFrom, Into, Display)]

[repr(u8)]

enum Opcode { Add, Sub, Mul, Load, Store, }

fn main() { asserteq!(Opcode::tryfrom(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)