#枚举 #表示 #repr #from #derive #枚举 #u8

from-to-repr

为Rust枚举的表示类型派生TryFrom和From实现

13个版本

0.2.2 2024年7月1日
0.2.1 2023年4月30日
0.2.0 2023年3月10日
0.1.10 2022年9月26日
0.1.1 2022年2月23日

#728进程宏

Download history 109/week @ 2024-04-15 60/week @ 2024-04-22 76/week @ 2024-04-29 40/week @ 2024-05-06 19/week @ 2024-05-13 26/week @ 2024-05-20 60/week @ 2024-05-27 91/week @ 2024-06-03 21/week @ 2024-06-10 30/week @ 2024-06-17 40/week @ 2024-06-24 213/week @ 2024-07-01 4/week @ 2024-07-08 5/week @ 2024-07-15 23/week @ 2024-07-22 51/week @ 2024-07-29

每月 85 次下载
2 crate 中使用

CC0 许可证

24KB
358

from-to-repr

提供进程宏FromToRepr,该宏可以应用于具有显式表示(例如 #[repr(u8)])的枚举,并从表示类型派生到枚举的TryFrom和从枚举派生到表示类型的From

例如,

#[derive(FromToRepr)]
#[repr(u8)]
enum ColorChannel {
    RED = 0,
    GREEN = 1,
    BLUE = 2,
}

变为

#[repr(u8)]
enum ColorChannel {
    RED = 0,
    GREEN = 1,
    BLUE = 2,
}
impl ::std::convert::TryFrom<u8> for ColorChannel {
    type Error = u8;
    fn try_from(value: u8) -> Result<Self, Self::Error> {
        if value == 0 {
            Ok(Self::RED)
        } else if value == 1 {
            Ok(Self::GREEN)
        } else if value == 2 {
            Ok(Self::BLUE)
        } else {
            Err(value)
        }
    }
}
impl ::std::convert::From<ColorChannel> for u8 {
    fn from(value: ColorChannel) -> Self {
        match value {
            ColorChannel::RED => 0,
            ColorChannel::GREEN => 1,
            ColorChannel::BLUE => 2,
        }
    }
}

from_to_other

此外,当启用功能from_to_other时,将启用名为from_to_other的属性宏,该宏生成到和从基类型的转换,使用Other枚举变体表示未知值。例如

use from_to_repr::from_to_other;

#[from_to_other(base_type = u8)]
enum ColorCommand {
    SetRed = 0,
    SetGreen = 1,
    SetBlue = 2,
    Other(u8),
}

等价于

enum ColorCommand {
    SetRed,
    SetGreen,
    SetBlue,
    Other(u8),
}
impl ::core::convert::From<u8> for ColorCommand {
    fn from(base_value: u8) -> Self {
        if base_value == 0 {
            Self::SetRed
        } else if base_value == 1 {
            Self::SetGreen
        } else if base_value == 2 {
            Self::SetBlue
        } else {
            Self::Other(value)
        }
    }
}
impl ::core::convert::From<ColorCommand> for u8 {
    fn from(enum_value: ColorCommand) -> Self {
        match enum_value {
            ColorCommand::SetRed => 0,
            ColorCommand::SetGreen => 1,
            ColorCommand::SetBlue => 2,
            ColorCommand::Other(other) => other,
        }
    }
}

依赖项

~275–720KB
~17K SLoC