Bug: 209654193

Clone this repo:
  1. 040bd3d Merge "Adding autogenerated Trusty makefile rules" into main am: 4b273e2a95 am: 8b2f4bd94f am: f840a15106 by Treehugger Robot · 5 months ago main master
  2. 4ada727 Merge "Adding autogenerated Trusty makefile rules" into main am: 4b273e2a95 am: a6fb6ce68c am: c56c655587 by Treehugger Robot · 5 months ago
  3. f840a15 Merge "Adding autogenerated Trusty makefile rules" into main am: 4b273e2a95 am: 8b2f4bd94f by Treehugger Robot · 5 months ago
  4. c56c655 Merge "Adding autogenerated Trusty makefile rules" into main am: 4b273e2a95 am: a6fb6ce68c by Treehugger Robot · 5 months ago
  5. 8b2f4bd Merge "Adding autogenerated Trusty makefile rules" into main am: 4b273e2a95 by Treehugger Robot · 5 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