3个版本
0.1.2 | 2023年10月30日 |
---|---|
0.1.1 | 2023年10月30日 |
0.1.0 | 2023年10月30日 |
723 在 过程宏
每月 27 次下载
9KB
151 行
Enumorph
生成宏推导,用于在newtype枚举变体及其包装值之间进行转换的 TryFrom
和 From
实现。
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