#枚举 #变体 #类型 #derive-debug #分发 #静态 #类型变体

variant_enum

variant enum. 生成枚举变体。静态分发。

1 个不稳定版本

0.1.0 2024年7月5日

#542 in 过程宏

MIT 协议

6KB
79

variant_enum

License Crates.io Docs

示例

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,
    },
}

生成

#[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) } }
}

依赖项

~260–710KB
~17K SLoC