tag | 47145a32ed47d48f602632a81f998be4018e44ac | |
---|---|---|
tagger | The Android Open Source Project <initial-contribution@android.com> | Wed Feb 01 23:41:10 2023 -0800 |
object | 62a4df906ab2fce9ff130774b76d9752d5d6130f |
t_frc_doc_330543000 (9299551,com.google.android.documentsui)
commit | 62a4df906ab2fce9ff130774b76d9752d5d6130f | [log] [tgz] |
---|---|---|
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | Mon May 09 06:00:18 2022 +0000 |
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | Mon May 09 06:00:18 2022 +0000 |
tree | 0a2877e03b38e1209fe8f8f3ef05f50c63e19f9e | |
parent | d5b902757f8a5b144c813e6838b16b32bd1ec76a [diff] | |
parent | dd00740b1d48623da248e01beeae74ddd16fd627 [diff] |
Snap for 8558685 from dd00740b1d48623da248e01beeae74ddd16fd627 to tm-frc-documentsui-release Change-Id: I9d32607c0d2e89e4d5d86e1daee3b7bb09cad4ca
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)
.