tagset 0.1.3

Easily create trait-dispatching sum types
Documentation

#[telety::telety(crate)]
#[tagset::tagset_meta]
#[meta(bounds())]
trait Tr {
    #[meta(default {
        let mut variants = vec![];
        foreach!(T => {
            variants.push(std::any::type_name::<T>().to_string());
        });
        variants
    })]
    fn variants() -> Vec<String>;

    #[meta(default {
        match_by_discriminant!(discriminant, T => {
            std::any::type_name::<T>().to_string()
        })
    })]
    fn discriminant_variant(discriminant: i32) -> String;

    #[meta(default {
        match_by_value!(self, variant => {
            std::any::type_name_of_val(variant).to_string()
        })
    })]
    fn variant(&self) -> String;
}

struct A;
struct B;
struct C;

#[tagset::tagset(impl Tr)]
#[tagset(A)]
#[tagset(B)]
#[tagset(C)]
struct S;

#[test]
fn foreach() {
    let variants = <S as Tr>::variants();
    assert_eq!(variants, vec!["macros::A", "macros::B", "macros::C"]);    
}

#[test]
fn match_by_value() {
    let s = S::from(A);
    assert_eq!(s.variant(), "macros::A");
    let s = S::from(B);
    assert_eq!(s.variant(), "macros::B");
    let s = S::from(C);
    assert_eq!(s.variant(), "macros::C");
}

#[test]
fn match_by_discriminant() {
    assert_eq!(S::discriminant_variant(0), "macros::A");
    assert_eq!(S::discriminant_variant(1), "macros::B");
    assert_eq!(S::discriminant_variant(2), "macros::C");
}