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.
```rust use enum_group::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;
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()); ```
Each character of the group label name for each variant must be alphanumeric or _
.
```rust use enum_group::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, } ```