Enum Group

enum-group is a simple derive macro crate that helps enum types to group their variants. Annotate an enum with #[derive(EnumGroup)], and mark variants some group label names with #[groups(label1, label2)] will auto generate function is_label1 and is_label2. These functions will tell you if a variant of the enum belongs to this grouping.

Example

```rust use enum_group::EnumGroup;

[derive(EnumGroup)]

enum Number { #[groups(odd)] One,

#[groups(even, prime)]
Two,

#[groups(odd, prime)]
Three,

Unknown(usize)

}

// Will auto generate function fn is_odd(&self) -> bool assert!(Number::One.isodd()); assert!(!Number::Two.isodd()); assert!(Number::Three.isodd()); assert!(!Number::Unknown(0).isodd());

// Will auto generate function fn is_even(&self) -> bool assert!(!Number::One.iseven()); assert!(Number::Two.iseven()); assert!(!Number::Three.iseven()); assert!(!Number::Unknown(0).iseven());

// Will auto generate function fn is_prime(&self) -> bool assert!(!Number::One.isprime()); assert!(Number::Two.isprime()); assert!(Number::Three.isprime()); assert!(!Number::Unknown(0).isprime()); ```

// Sometimes, you may have a large number of group label names with the same prefix, // and you can use this nested grouping to reduce code duplication. // It support multi-level nesting. ```rust use enum_group::EnumGroup;

[derive(EnumGroup)]

enum Typing {

#[groups(accept(eq, ne, gt, gte, lt, lte), number)]
I8,

#[groups(accept(not, eq, ne))]
Bool,

}

assert!(!Typing::I8.isacceptnot()); assert!(Typing::I8.isaccepteq()); assert!(Typing::I8.isacceptne()); assert!(Typing::I8.isacceptgt()); assert!(Typing::I8.isacceptgte()); assert!(Typing::I8.isacceptlt()); assert!(Typing::I8.isacceptlte()); assert!(Typing::I8.is_number());

assert!(Typing::Bool.isacceptnot()); assert!(Typing::Bool.isaccepteq()); assert!(Typing::Bool.isacceptne()); assert!(!Typing::Bool.isacceptgt()); assert!(!Typing::Bool.isacceptgte()); assert!(!Typing::Bool.isacceptlt()); assert!(!Typing::Bool.isacceptlte()); assert!(!Typing::Bool.is_number()); ```

Usage Restrictions

Each character of the group label name for each variant must be alphanumeric or _.

Panic

```rust use enum_group::EnumGroup;

[derive(EnumGroup)]

enum Number { // #[groups(odd&)] groups attribute ident can only contain the characters a-zA-Z0-9 // #[groups(odd)] groups attribute ident must starts wtih characters a-zA-Z // #[groups(odd)] groups attribute ident must ends wtih characters a-zA-Z // #[groups()] must have group ident in groups attribute One, } ```