1 个不稳定版本
0.0.1 | 2022年11月22日 |
---|
#5 在 #tryfrom
338 每月下载量
13KB
78 行
enum-try-from
Rust 宏,用于创建具有 TryFrom
特性实现的枚举。
示例
use enum_try_into::impl_enum_try_from;
impl_enum_try_from!(
#[repr(u16)]
#[derive(PartialEq, Eq, Debug)]
enum MyEnum {
Foo = 0,
Bar = 1,
Baz = 2,
},
u16,
(),
()
);
fn main() {
assert_eq!(MyEnum::try_from(0), Ok(MyEnum::Foo));
assert_eq!(MyEnum::try_from(1), Ok(MyEnum::Bar));
assert_eq!(MyEnum::try_from(2), Ok(MyEnum::Baz));
assert_eq!(MyEnum::try_from(3), Err(()));
}
use enum_try_into::impl_enum_try_from;
use thiserror::Error;
#[derive(Error, Debug, PartialEq, Eq)]
pub enum MyError {
#[error("invalid value")]
InvalidValue,
}
impl_enum_try_from!(
#[repr(u16)]
#[derive(PartialEq, Eq, Debug)]
enum MyEnum {
Foo = 0,
Bar = 1,
Baz = 2,
},
u16,
MyError,
MyError::InvalidValue
);
如果提供给 try_from
的值应从大端转换
use enum_try_into::impl_enum_try_from_be;
impl_enum_try_from_be!(
#[repr(u16)]
#[derive(PartialEq, Eq, Debug)]
enum MyEnum {
Foo = 0x1234,
Bar = 0x5678,
Baz = 0x9abc,
},
u16,
(),
()
);
fn main() {
assert_eq!(MyEnum::try_from(0x3412), Ok(MyEnum::Foo));
assert_eq!(MyEnum::try_from(0x7856), Ok(MyEnum::Bar));
assert_eq!(MyEnum::try_from(0xbc9a), Ok(MyEnum::Baz));
assert_eq!(MyEnum::try_from(0xdef0), Err(()));
}
为什么存在它?
Rust 项目通常会以常规整数的形式消费值,然后尝试将它们与枚举匹配。这样做需要为枚举实现 TryFrom
特性。示例
#[repr(u16)]
#[derive(PartialEq, Eq, Debug)]
enum MyEnum {
Foo = 0,
Bar = 1,
Baz = 2,
}
impl TryFrom<u16> for MyEnum {
type Error = ();
fn try_from(v: u16) -> Result<Self, Self::Error> {
match v {
0 => Ok(MyEnum::Foo),
1 => Ok(MyEnum::Bar),
2 => Ok(MyEnum::Baz),
_ => Err(()),
}
}
}
fn main() {
assert_eq!(MyEnum::try_from(0), Ok(MyEnum::Foo));
assert_eq!(MyEnum::try_from(1), Ok(MyEnum::Bar));
assert_eq!(MyEnum::try_from(2), Ok(MyEnum::Baz));
assert_eq!(MyEnum::try_from(3), Err(()));
}
这需要多次列出所有枚举变体,并且在将新变体添加到现有枚举时也需要多次写下新变体。
这个crate的目标是避免这种情况,并仅定义一次枚举变体。