enum_ordinalize/
variant_type.rs

1use proc_macro2::{Ident, Span, TokenStream};
2use quote::{ToTokens, TokenStreamExt};
3
4#[allow(clippy::upper_case_acronyms)]
5#[derive(Debug, Copy, Clone, Eq, PartialEq)]
6pub(crate) enum VariantType {
7    ISIZE,
8    I8,
9    I16,
10    I32,
11    I64,
12    I128,
13    USIZE,
14    U8,
15    U16,
16    U32,
17    U64,
18    U128,
19    Nondetermined,
20}
21
22impl VariantType {
23    #[inline]
24    pub(crate) fn from_str<S: AsRef<str>>(s: S) -> VariantType {
25        let s = s.as_ref();
26
27        match s {
28            "isize" => VariantType::ISIZE,
29            "i8" => VariantType::I8,
30            "i16" => VariantType::I16,
31            "i32" => VariantType::I32,
32            "i64" => VariantType::I64,
33            "i128" => VariantType::I128,
34            "usize" => VariantType::USIZE,
35            "u8" => VariantType::U8,
36            "u16" => VariantType::U16,
37            "u32" => VariantType::U32,
38            "u64" => VariantType::U64,
39            "u128" => VariantType::U128,
40            _ => VariantType::Nondetermined,
41        }
42    }
43
44    #[inline]
45    pub(crate) fn as_str(&self) -> &'static str {
46        match self {
47            VariantType::ISIZE => "isize",
48            VariantType::I8 => "i8",
49            VariantType::I16 => "i16",
50            VariantType::I32 => "i32",
51            VariantType::I64 => "i64",
52            VariantType::I128 => "i128",
53            VariantType::USIZE => "usize",
54            VariantType::U8 => "u8",
55            VariantType::U16 => "u16",
56            VariantType::U32 => "u32",
57            VariantType::U64 => "u64",
58            VariantType::U128 => "u128",
59            _ => unreachable!(),
60        }
61    }
62}
63
64impl Default for VariantType {
65    #[inline]
66    fn default() -> Self {
67        VariantType::Nondetermined
68    }
69}
70
71impl ToTokens for VariantType {
72    #[inline]
73    fn to_tokens(&self, tokens: &mut TokenStream) {
74        tokens.append(Ident::new(self.as_str(), Span::call_site()));
75    }
76}