Bug: 209654193

Clone this repo:
  1. c683662 Migrate 25 crates to monorepo. am: 1e5d8e3874 by James Farrell · 1 year, 1 month ago main master
  2. 1e5d8e3 Migrate 25 crates to monorepo. by James Farrell · 1 year, 1 month ago main-16k
  3. 6b814db Update Android.bp by running cargo_embargo am: 2209338dfa by James Farrell · 1 year, 2 months ago
  4. 2209338 Update Android.bp by running cargo_embargo by James Farrell · 1 year, 2 months ago
  5. 020607d Cleanup license metadata in external/rust/crates/enumn. am: 64c2d06931 by Wei Li · 1 year, 2 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