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 在 进程宏
每月 85 次下载
在 2 crate 中使用
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