Github
Github Download Tests crates.io docs.rs

penum is a procedural macro that is used to make an enum conform to a given pattern that can include generics with trait bounds, which then allows for static dispatching. It's a tool for asserting how enums should look and behave through simple expressive rust grammar.

Allowing developers to assert how an enum should look and behave.

Installation

This crate is available on crates.io and can be used by adding the following to your project's Cargo.toml: toml [dependencies] penum = "0.1.15" Or run this command in your cargo project: sh $ cargo add penum

Overview

enum Foo { V1(Struct), V2(Struct), } ```

rust struct Struct; trait Trait { fn method(&self, text: &str); } impl Trait for Struct {}

Examples

Used penum to force every variant to be a tuple with one field that must implement Copy.

```rust

[penum( (T) where T: Copy )]

enum Guard { Bar(String), ^^^^^^ // ERROR: String doesn't implement Copy

Bor(&str), 
    ^^^^
// ERROR: `&str` doesn't implement `Copy`

Bur(Vec<i32>), 
    ^^^^^^^^
// ERROR: `Vec<i32>` doesn't implement `Copy`

Bir(i32, i32), 
   ^^^^^^^^^^
// ERROR: `(i32, i32)` doesn't match pattern `(T)`

Byr(), 
^^^^^
// ERROR: `Byr()` doesn't match pattern `(T)`

Bxr { name: usize }, 
    ^^^^^^^^^^^^^^^
// ERROR: `{ nname: usize }` doesn't match pattern `(T)`

Brr, 
^^^
// ERROR: `Brr` doesn't match pattern `(T)`

Beer(i32) // Works!

} ```

```rust

[penum( (impl Copy) )]

enum Guard { Bar(String), ^^^^^^ // ERROR: String doesn't implement Copy

Bor(Vec<&str>), 
    ^^^^^^^^^
// ERROR: `Vec<&str>` doesn't implement `Copy`

Bur(Vec<i32>), 
    ^^^^^^^^
// ERROR: `Vec<i32>` doesn't implement `Copy`

Bir(i32, i32), 
   ^^^^^^^^^^
// ERROR: `(i32, i32)` doesn't match pattern `(T)`

Byr(), 
^^^^^
// ERROR: `Byr()` doesn't match pattern `(T)`

Bxr { name: usize }, 
    ^^^^^^^^^^^^^^^
// ERROR: `{ nname: usize }` doesn't match pattern `(T)`

Brr, 
^^^
// ERROR: `Brr` doesn't match pattern `(T)`

Beer(i32) // Works!

} ```

Under development

| Traits | Supported | | ---------- | ------------- | |Any| supported | |Borrow| supported | |BorrowMut| supported | |Eq| supported | |AsMut| supported | |AsRef| supported | |From| supported | |Into| supported | |TryFrom| supported | |TryInto| supported | |Default| supported | |Binary| supported | |Debug| supported | |Display| supported | |LowerExp| supported | |LowerHex| supported | |Octal| supported | |Pointer| supported | |UpperExp| supported | |UpperHex| supported | |Future| supported | |IntoFuture| supported | |FromIterator| supported | |FusedIterator| supported | |IntoIterator| supported | |Product| supported | |Sum| supported | |Copy| supported | |Sized| supported | |ToSocketAddrs| supported | |Add| supported | |AddAssign| supported | |BitAnd| supported | |BitAndAssign| supported | |BitOr| supported | |BitOrAssign| supported | |BitXor| supported | |BitXorAssign| supported | |Deref| supported | |DerefMut| supported | |Div| supported | |DivAssign| supported | |Drop| supported | |Fn| supported | |FnMut| supported | |FnOnce| supported | |Index| supported | |IndexMut| supported | |Mul| supported | |MulAssign| supported | |MultiMethod| supported | |Neg| supported | |Not| supported | |Rem| supported | |RemAssign| supported | |Shl| supported | |ShlAssign| supported | |Shr| supported | |ShrAssign| supported | |Sub| supported | |SubAssign| supported | |Termination| supported | |SliceIndex| supported | |FromStr| supported | |ToString| supported |