aqlgen_renderer/renderer/mod_file/
root_module_renderer.rs1use 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}