educe/common/
ident_index.rs

1use quote::ToTokens;
2use syn::{Ident, Index};
3
4pub(crate) enum IdentOrIndex {
5    Ident(Ident),
6    Index(Index),
7}
8
9impl From<Ident> for IdentOrIndex {
10    #[inline]
11    fn from(value: Ident) -> Self {
12        Self::Ident(value)
13    }
14}
15
16impl From<Index> for IdentOrIndex {
17    #[inline]
18    fn from(value: Index) -> Self {
19        Self::Index(value)
20    }
21}
22
23impl From<&Ident> for IdentOrIndex {
24    #[inline]
25    fn from(value: &Ident) -> Self {
26        Self::Ident(value.clone())
27    }
28}
29
30impl From<usize> for IdentOrIndex {
31    #[inline]
32    fn from(value: usize) -> Self {
33        Self::Index(Index::from(value))
34    }
35}
36
37impl ToTokens for IdentOrIndex {
38    #[inline]
39    fn to_tokens(&self, token_stream: &mut proc_macro2::TokenStream) {
40        match self {
41            Self::Ident(ident) => ToTokens::to_tokens(ident, token_stream),
42            Self::Index(index) => ToTokens::to_tokens(index, token_stream),
43        }
44    }
45}
46
47impl IdentOrIndex {
48    #[inline]
49    pub(crate) fn from_ident_with_index(ident: Option<&Ident>, index: usize) -> IdentOrIndex {
50        if let Some(ident) = ident {
51            Self::from(ident)
52        } else {
53            Self::from(index)
54        }
55    }
56}