telety_impl/alias/
module.rs1use 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}