Bug: 209654193

Clone this repo:
  1. 472837b Merge "Update TEST_MAPPING" am: 6e214cd408 am: e0a07cff4b by Treehugger Robot · 6 months ago main-16k master
  2. e0a07cf Merge "Update TEST_MAPPING" am: 6e214cd408 by Treehugger Robot · 6 months ago
  3. 6e214cd Merge "Update TEST_MAPPING" by Treehugger Robot · 6 months ago
  4. c22f8cd Update TEST_MAPPING by Matthew Maurer · 6 months ago
  5. d341790 Merge "Update TEST_MAPPING" am: 998483fd3f am: df2995b836 by Matthew Maurer · 6 months ago

Convert number to enum

This crate provides a derive macro to generate a function for converting a primitive integer into the corresponding variant of an enum.

The generated function is named n and has the following signature:

impl YourEnum {
    pub fn n(value: Repr) -> Option<Self>;
}

where Repr is an integer type of the right size as described in more detail below.

Example

use enumn::N;

#[derive(PartialEq, Debug, N)]
enum Status {
    LegendaryTriumph,
    QualifiedSuccess,
    FortuitousRevival,
    IndeterminateStalemate,
    RecoverableSetback,
    DireMisadventure,
    AbjectFailure,
}

fn main() {
    let s = Status::n(1);
    assert_eq!(s, Some(Status::QualifiedSuccess));

    let s = Status::n(9);
    assert_eq!(s, None);
}

Signature

The generated signature depends on whether the enum has a #[repr(..)] attribute. If a repr is specified, the input to n will be required to be of that type.

#[derive(enumn::N)]
#[repr(u8)]
enum E {
    /* ... */
}

// expands to:
impl E {
    pub fn n(value: u8) -> Option<Self> {
        /* ... */
    }
}

On the other hand if no repr is specified then we get a signature that is generic over a variety of possible types.

impl E {
    pub fn n<REPR: Into<i64>>(value: REPR) -> Option<Self> {
        /* ... */
    }
}

Discriminants

The conversion respects explictly specified enum discriminants. Consider this enum:

#[derive(enumn::N)]
enum Letter {
    A = 65,
    B = 66,
}

Here Letter::n(65) would return Some(Letter::A).

License