trait_info_gen/
lib.rs

1/*
2Hereditary
3Autors: Francisco Leon <https://github.com/superoptimo>
4License Apache-2.0
5*/
6
7use proc_macro2::token_stream::TokenStream as TkStream;
8use syn::ItemTrait;
9
10mod simple_trait_info;
11mod trait_path_attrib;
12
13/// exports
14pub use simple_trait_info::SimpleTraitInfo;
15/// Utility for handling trait paths
16pub use trait_path_attrib::TraitPathAttrib;
17
18/// Internal  Macro processing
19fn process_trait(trait_decl: ItemTrait) -> TkStream
20{
21    let traitvis = trait_decl.vis.clone();
22
23    let macrovis = if let syn::Visibility::Public(_) = traitvis {
24        quote::quote!{#[macro_export]}
25    }
26    else {quote::quote!{}};
27    
28    let trait_macro_name = syn::Ident::new(format!("TraitInfo_{}", trait_decl.ident).as_str(), trait_decl.ident.span());
29
30    let simp_trait_info = SimpleTraitInfo::create(&trait_decl);
31
32    // Macro name with base32 encoding hash suffix
33    let base32hash_tinfo = simp_trait_info.hash_base32();
34    let trait_macro_name_real = syn::Ident::new(format!("TraitInfo{}_{}", base32hash_tinfo,  trait_decl.ident).as_str(), trait_decl.ident.span());
35
36    quote::quote!(
37        #trait_decl
38
39        #macrovis
40        macro_rules! #trait_macro_name_real {
41            ($target_bridge_macro:ident, [ $($bridgecontent:tt)*]) => {
42                $target_bridge_macro!([$($bridgecontent)*],[ #simp_trait_info ]);
43            };
44        }
45
46        #traitvis use #trait_macro_name_real as #trait_macro_name;
47    )
48
49}
50
51/// Entry point for macro trait info generation
52pub fn trait_info_codegen(input:TkStream) -> TkStream
53{
54    let parse_status = syn::parse2::<ItemTrait>(input);
55    match parse_status {
56        syn::Result::Ok(tinfo) => {
57            process_trait(tinfo)
58        },
59        syn::Result::Err(errobj) =>{
60            errobj.into_compile_error()
61        }
62    }
63}
64