telety_impl/alias/
module.rs

1use quote::{format_ident, quote};
2use syn::spanned::Spanned as _;
3
4#[derive(Debug)]
5pub struct Module {
6    visibility: syn::Visibility,
7    ident: syn::Ident,
8}
9
10impl Module {
11    pub fn from_named_item(item: &syn::Item) -> syn::Result<Self> {
12        let (visibility, ident) = match item {
13            syn::Item::Enum(item_enum) => (&item_enum.vis, &item_enum.ident),
14            syn::Item::Struct(item_struct) => (&item_struct.vis, &item_struct.ident),
15            syn::Item::Union(item_union) => (&item_union.vis, &item_union.ident),
16            syn::Item::Trait(item_trait) => (&item_trait.vis, &item_trait.ident),
17            _ => return Err(syn::Error::new(item.span(), "Only enums, structs, unions, and traits are currently supported")),
18        };
19
20        let visibility = visibility.clone();
21        let ident = format_ident!("__telety_alias_map_{ident}");
22        Ok(Self {
23            visibility,
24            ident,
25        })
26    }
27
28    pub fn visibility(&self) -> &syn::Visibility {
29        &self.visibility
30    }
31
32    pub fn ident(&self) -> &syn::Ident {
33        &self.ident
34    }
35
36    pub fn new_child(&self, suffix: &str) -> Self {
37        let Self {
38            visibility,
39            ident,
40        } = self;
41        let visibility = visibility.clone();
42        let ident = format_ident!("{ident}__{suffix}");
43
44        Self {
45            visibility,
46            ident,
47        }
48    }
49
50    pub fn with_contents<C: quote::ToTokens>(&self, contents: &C) -> impl quote::ToTokens + use<C> {
51        let Self {
52            visibility,
53            ident,
54        } = self;
55
56        quote! {
57            #[doc(hidden)]
58            #[allow(dead_code)]
59            #[allow(unused_macros)]
60            #[allow(unused_imports)]
61            #[allow(non_snake_case)]
62            #[allow(non_camel_case_types)]
63            #[allow(non_local_definitions)]
64            #visibility mod #ident {
65                #contents
66            }
67        }
68    }
69}