penum 0.1.30

Make enum conform to a given pattern
Documentation
#![allow(dead_code, unused_imports)]
use penum::penum;

struct Al;
struct Be(i32);
struct Ce(usize);

#[penum]
trait Echo {
    fn echo(&self) -> String;
}

#[penum]
trait AsInner<T> {
    fn as_inner(&self) -> &T;
}

impl Echo for Al {
    fn echo(&self) -> String {
        "A".to_string()
    }
}
impl Echo for Be {
    fn echo(&self) -> String {
        format!("B {}", self.0)
    }
}
impl Echo for Ce {
    fn echo(&self) -> String {
        format!("C {}", self.0)
    }
}

impl AsInner<i32> for Be {
    fn as_inner(&self) -> &i32 {
        &self.0
    }
}

impl AsInner<usize> for Ce {
    fn as_inner(&self) -> &usize {
        &self.0
    }
}

#[penum( (T) |  where T: ^Echo, Be: ^AsInner<i32>)]
enum Foo {
    V1(Al),
    V2(Be),
    V3(Ce),
}

fn main() {
    let foo_a = Foo::V1(Al);
    let foo_b = Foo::V2(Be(2));
    let foo_c = Foo::V3(Ce(3));

    assert_eq!("", foo_a.echo());
    assert_eq!("B 2", foo_b.echo());
    assert_eq!("", foo_c.echo());

    assert_eq!(&0, foo_a.as_inner());
    assert_eq!(&2, foo_b.as_inner());
    assert_eq!(&0, foo_c.as_inner());
}