commit | 71b3b4d152d14e01c7256b65a57be5683d4a5ece | [log] [tgz] |
---|---|---|
author | Matthew Maurer <mmaurer@google.com> | Tue May 31 17:23:42 2022 +0000 |
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | Tue May 31 17:23:42 2022 +0000 |
tree | c70c4f140e50a72b4a531225c3eae4c51f1cf26d | |
parent | 29993cd5b449c79a1490b0d6f4d6fcaf16d15dee [diff] | |
parent | d34179082a1abc5f34e3989fcda8220228c6e7bc [diff] |
Merge "Update TEST_MAPPING" am: 998483fd3f am: df2995b836 am: d34179082a Original change: https://android-review.googlesource.com/c/platform/external/rust/crates/enumn/+/2107051 Change-Id: Ib229b5a6dbda2a770422abf3bc776549122fc6e8 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
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)
.