#enums #representation #repr #derive #from #enumeration #u8

macro from-to-repr

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

13 releases

0.2.2 Jul 1, 2024
0.2.1 Apr 30, 2023
0.2.0 Mar 10, 2023
0.1.10 Sep 26, 2022
0.1.1 Feb 23, 2022

#758 in Procedural macros

Download history 22/week @ 2024-07-21 57/week @ 2024-07-28 53/week @ 2024-08-04 4/week @ 2024-08-11 4/week @ 2024-08-18 18/week @ 2024-08-25 4/week @ 2024-09-01 11/week @ 2024-09-08 26/week @ 2024-09-15 47/week @ 2024-09-22 84/week @ 2024-09-29 18/week @ 2024-10-06 19/week @ 2024-10-13 186/week @ 2024-10-20 170/week @ 2024-10-27 48/week @ 2024-11-03

424 downloads per month
Used in 3 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

~240–690KB
~16K SLoC