aqlgen_renderer/renderer/mod_file/
root_module_renderer.rs

1use proc_macro2::{Ident, Span, TokenStream};
2use quote::quote;
3
4use super::{Context, Save};
5
6pub struct Renderer<'a, 'b> {
7    pub context: &'a Context<'b>,
8}
9
10impl<'a, 'b> Save for Renderer<'a, 'b> {
11    fn file_name(&self) -> String {
12        "mod".to_string()
13    }
14
15    fn super_module_name(&self) -> Option<String> {
16        None
17    }
18
19    fn str_src(&self) -> String {
20        Renderer::token_stream(self).to_string()
21    }
22}
23
24impl<'a, 'b> Renderer<'a, 'b> {
25    pub fn create_file(context: &'a Context<'b>) {
26        let obj = Self { context };
27        obj.save(context);
28    }
29
30    fn token_stream(&self) -> TokenStream {
31        let modules = self.modules();
32        let uses = self.uses();
33        quote!(
34            #modules
35            #uses
36        )
37    }
38
39    fn modules(&self) -> TokenStream {
40        let mut modules = quote! { };
41        self.context.structured_file_paths().iter().for_each(|f| {
42            let name = Ident::new(f.0, Span::call_site());
43            modules = quote!(
44              #modules
45              mod #name;
46            );
47        });
48        modules
49    }
50
51    fn uses(&self) -> TokenStream {
52        let mut uses = quote! { };
53        self.context.file_paths().iter().for_each(|f| {
54            let super_module_name = Ident::new(&f.super_module_name, Span::call_site());
55            let name = Ident::new(&f.name, Span::call_site());
56            uses = quote!(
57                #uses
58                pub use #super_module_name::#name;
59            )
60        });
61        uses
62    }
63}