#枚举 #整数 #转换 #原始类型 #原始整数 #tryfrom

enum-try-from

Rust 宏,用于创建具有 TryFrom 特性实现的枚举

1 个不稳定版本

0.0.1 2022年11月22日

#5#tryfrom

Download history 172/week @ 2024-03-27 131/week @ 2024-04-03 234/week @ 2024-04-10 280/week @ 2024-04-17 424/week @ 2024-04-24 274/week @ 2024-05-01 192/week @ 2024-05-08 448/week @ 2024-05-15 427/week @ 2024-05-22 326/week @ 2024-05-29 109/week @ 2024-06-05 263/week @ 2024-06-12 22/week @ 2024-06-19 113/week @ 2024-06-26 140/week @ 2024-07-03 29/week @ 2024-07-10

338 每月下载量

MIT 许可证

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的目标是避免这种情况,并仅定义一次枚举变体。

无运行时依赖