#enums #open #integer #integer-value #newtype

no-std bin+lib open-enum

An attribute for generating "open" fieldless enums, those that accept any integer value, by using a newtype struct and associated constants

6 releases (breaking)

0.5.0 Feb 15, 2024
0.4.1 Nov 18, 2023
0.4.0 Sep 2, 2023
0.3.0 Sep 12, 2022
0.1.0 Sep 2, 2022

#269 in Rust patterns

Download history 622/week @ 2023-12-18 270/week @ 2023-12-25 599/week @ 2024-01-01 960/week @ 2024-01-08 1247/week @ 2024-01-15 1235/week @ 2024-01-22 1700/week @ 2024-01-29 1896/week @ 2024-02-05 1901/week @ 2024-02-12 2086/week @ 2024-02-19 3526/week @ 2024-02-26 3924/week @ 2024-03-04 3724/week @ 2024-03-11 3805/week @ 2024-03-18 2565/week @ 2024-03-25 6626/week @ 2024-04-01

17,011 downloads per month
Used in 2 crates

Apache-2.0

21KB
106 lines

open-enum

Rust enums are closed, meaning that the integer value distinguishing an enum, its discriminant, must be one of the variants listed. If the integer value isn't one of those discriminants, it is considered immediate undefined behavior. This is true for enums with and without fields. This can make working with enums troublesome in high performance code that can't afford premature runtime checks. It can also introduce Undefined Behavior at unexpected times if the author is unfamiliar with the rules of writing unsafe Rust.

In constrast, C++ scoped enumerations are open, meaning that the enum is a strongly-typed integer that could hold any value, though with a scoped set of well-known values. open-enum lets you have this in Rust. It turns this enum declaration:

#[open_enum]
enum Color {
    Red,
    Green,
    Blue,
    Orange,
    Black,
}

into a tuple struct with associated constants:

#[derive(PartialEq, Eq)]  // In order to work in `match`.
struct Color(pub u8);  // Automatic integer type, can be specified.

impl Color {
    pub const Red: Self = Color(0);
    pub const Green: Self = Color(1);
    pub const Blue: Self = Color(2);
    pub const Orange: Self = Color(3);
    pub const Black: Self = Color(4);
}

Contributing

See CONTRIBUTING.md for details.

License

Apache 2.0; see LICENSE for details.

Disclaimer

This project is not an official Google project. It is not supported by Google and Google specifically disclaims all warranties as to its quality, merchantability, or fitness for a particular purpose.

Dependencies

~330–790KB
~19K SLoC