| commit | 020607db942cfe5c7bd96b1b5d9d21298a8eac90 | [log] [tgz] |
|---|---|---|
| author | Wei Li <[email protected]> | Fri Aug 02 17:15:53 2024 +0000 |
| committer | Automerger Merge Worker <[email protected]> | Fri Aug 02 17:15:53 2024 +0000 |
| tree | 9a32afa4061dfccbfe0b11a27acf6750bc9b743c | |
| parent | d7553c043b43f0124580621c19ae1fb065b0ff75 [diff] | |
| parent | 64c2d06931a34db838752defb9fc37fd22681292 [diff] |
Cleanup license metadata in external/rust/crates/enumn. am: 64c2d06931 Original change: https://android-review.googlesource.com/c/platform/external/rust/crates/enumn/+/3205059 Change-Id: I53812d32f41600a4fa3f8801c8224f0e4812cfae Signed-off-by: Automerger Merge Worker <[email protected]>
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.
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); }
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> { /* ... */ } }
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).