Bug: 209654193

Clone this repo:
  1. 755f4d1 Move OWNER reference master=>main. by Sam Saccone · 10 weeks ago build-tools-release main master
  2. 5785a70 Upgrade enumn to 0.1.8 am: 3b2398c024 by Matthew Maurer · 4 months ago
  3. 3b2398c Upgrade enumn to 0.1.8 by Matthew Maurer · 6 months ago
  4. b2857ce Make enumn available to product and vendor am: d40c576a19 am: 022c204831 by Matthew Maurer · 7 months ago
  5. 022c204 Make enumn available to product and vendor am: d40c576a19 by Matthew Maurer · 7 months ago android-u-beta-1-gpl

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