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 _ => {
18 return Err(syn::Error::new(
19 item.span(),
20 "Only enums, structs, unions, and traits are currently supported",
21 ));
22 }
23 };
24
25 let visibility = visibility.clone();
26 let ident = format_ident!("__telety_alias_map_{ident}");
27 Ok(Self { visibility, ident })
28 }
29
30 pub fn visibility(&self) -> &syn::Visibility {
31 &self.visibility
32 }
33
34 pub fn ident(&self) -> &syn::Ident {
35 &self.ident
36 }
37
38 pub fn new_child(&self, suffix: &str) -> Self {
39 let Self { visibility, ident } = self;
40 let visibility = visibility.clone();
41 let ident = format_ident!("{ident}__{suffix}");
42
43 Self { visibility, ident }
44 }
45
46 pub fn with_contents<C: quote::ToTokens>(&self, contents: &C) -> impl quote::ToTokens + use<C> {
47 let Self { visibility, ident } = self;
48
49 quote! {
50 #[doc(hidden)]
51 #[allow(dead_code)]
52 #[allow(unused_macros)]
53 #[allow(unused_imports)]
54 #[allow(non_snake_case)]
55 #[allow(non_camel_case_types)]
56 #[allow(non_local_definitions)]
57 #visibility mod #ident {
58 #contents
59 }
60 }
61 }
62}