#枚举 #变体 # #生成 #新类型 # #宏推导

enumorph

生成宏推导,用于在newtype枚举变体及其包装值之间进行转换的 TryFromFrom 实现

3个版本

0.1.2 2023年10月30日
0.1.1 2023年10月30日
0.1.0 2023年10月30日

723过程宏

每月 27 次下载

MIT/Apache

9KB
151

Enumorph

生成宏推导,用于在newtype枚举变体及其包装值之间进行转换的 TryFromFrom 实现。

use std::fmt::Display;

use enumorph::Enumorph;

#[derive(Enumorph)]
enum Enum<T: ToOwned + ?Sized, U>
where
    U: Display,
{
    A(A<T>),
    B {
        b: B<U>,
    },
    #[enumorph(ignore)]
    C,
    #[enumorph(ignore)]
    D {
        e: u8,
        f: bool,
    },
}

struct A<T: ToOwned + ?Sized>(T::Owned);

struct B<U: Display>(U);

fn main() {
    assert!(matches!(
        Enum::<str, u8>::from(A("a".to_owned())),
        Enum::A(A(_))
    ));

    assert!(matches!(
        A::try_from(Enum::<str, u8>::A(A("a".to_owned()))),
        Ok(A(_))
    ));

    assert!(matches!(Enum::<str, u8>::from(B(1)), Enum::B { b: B(1) }));

    assert!(matches!(
        B::try_from(Enum::<str, u8>::B { b: B(1) }),
        Ok(B(1))
    ));

    assert!(matches!(B::try_from(Enum::<str, u8>::C), Err(Enum::C)));
}

限制

如果两个变体“包装”相同类型,则生成的From和TryFrom实现将重叠。在这种情况下,您可以将内部类型包装在一个新类型中

#[derive(Enumorph)]
enum T {
    U(U),
    V(V),
}

struct U(String);
struct V(String);

依赖关系

~255–700KB
~17K SLoC