#enums #from

macro from-to-repr

Derives TryFrom and From implementations for the representation type of a Rust enumeration

12 releases

0.2.1 Apr 30, 2023
0.2.0 Mar 10, 2023
0.1.10 Sep 26, 2022
0.1.2 Aug 28, 2022
0.1.1 Feb 23, 2022

#1169 in Procedural macros

Download history 32/week @ 2023-12-14 30/week @ 2023-12-21 20/week @ 2023-12-28 49/week @ 2024-01-04 31/week @ 2024-01-11 59/week @ 2024-01-18 38/week @ 2024-01-25 44/week @ 2024-02-01 59/week @ 2024-02-08 93/week @ 2024-02-15 105/week @ 2024-02-22 64/week @ 2024-02-29 89/week @ 2024-03-07 162/week @ 2024-03-14 111/week @ 2024-03-21 242/week @ 2024-03-28

613 downloads per month
Used in 2 crates

CC0 license

24KB
358 lines

from-to-repr

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,
        }
    }
}

from_to_other

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,
        }
    }
}

Dependencies

~320–770KB
~18K SLoC