Crates.io | from-to-repr |
lib.rs | from-to-repr |
version | 0.2.2 |
source | src |
created_at | 2022-02-23 21:17:56.763317 |
updated_at | 2024-07-01 08:30:56.778024 |
description | Derives TryFrom and From implementations for the representation type of a Rust enumeration. |
homepage | |
repository | https://github.com/RavuAlHemio/from-to-repr |
max_upload_size | |
id | 538114 |
size | 35,340 |
Provides the procedural macro FromToRepr
which can be applied to a enum with an explicit representation (e.g #[repr(u8)]
) and derives TryFrom
from the representation type to the enum and From
from the enum to the representation type.
As an example,
#[derive(FromToRepr)]
#[repr(u8)]
enum ColorChannel {
RED = 0,
GREEN = 1,
BLUE = 2,
}
becomes
#[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,
}
}
}
Additionally, when the feature from_to_other
is enabled, an attribute macro named from_to_other
is enabled, which generates conversions to and from a base type, representing unknown values using an Other
enum variant. For example:
use from_to_repr::from_to_other;
#[from_to_other(base_type = u8)]
enum ColorCommand {
SetRed = 0,
SetGreen = 1,
SetBlue = 2,
Other(u8),
}
is equivalent to
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,
}
}
}