#variant #enums #typed #derive-debug #typed-variant

macro variant_enum

variant enum. generate enum variant. static dispatch.

1 unstable release

0.1.0 Jul 5, 2024

#679 in Procedural macros

MIT license

6KB
79 lines

variant_enum

License Crates.io Docs

Example

use variant_enum::typed_variant;

#[typed_variant(derive(Debug))]
#[derive(derive_more::From)]
pub enum Msg {
    #[inner(derive(Clone))]
    A {
        pub a: u32,
        b: f32,
        c: usize,
        d: String,
    },
    B {
        foo: String,
    },
    C {
        bar: bool,
    },
}

generated:

#[derive(Debug)]
#[derive(derive_more::From)]
pub enum Msg {
    A(A),
    B(B),
    C(C),
}
#[derive(Clone)]
#[derive(Debug)]
pub struct A {
    pub a: u32,
    b: f32,
    c: usize,
    d: String,
}
#[derive(Debug)]
pub struct B {
    foo: String,
}
#[derive(Debug)]
pub struct C {
    bar: bool,
}
impl TryFrom<Msg> for A {
    type Error = Msg;
    fn try_from(value: Msg) -> Result<Self, Self::Error> { if let Msg::A(m) = value { Ok(m) } else { Err(value) } }
}
impl TryFrom<Msg> for B {
    type Error = Msg;
    fn try_from(value: Msg) -> Result<Self, Self::Error> { if let Msg::B(m) = value { Ok(m) } else { Err(value) } }
}
impl TryFrom<Msg> for C {
    type Error = Msg;
    fn try_from(value: Msg) -> Result<Self, Self::Error> { if let Msg::C(m) = value { Ok(m) } else { Err(value) } }
}

Dependencies

~240–690KB
~16K SLoC