aqlgen_renderer/renderer/mutation/
renderer.rs

1use proc_macro2::{Ident, Span, TokenStream};
2use quote::quote;
3
4use super::{
5    FileRender, MutationTypeWrapper, MutationsTypeWrapper, RenderDependencies, RenderField,
6    RenderType, Save, SupportField, SupportType,
7};
8
9pub struct Renderer<'a, 'b> {
10    wrapper_object: &'a MutationsTypeWrapper<'a, 'b>,
11}
12
13impl<'a, 'b> RenderField for Renderer<'a, 'b> {}
14
15impl<'a, 'b> RenderDependencies for Renderer<'a, 'b> {}
16
17impl<'a, 'b> Save for Renderer<'a, 'b> {
18    fn file_name(&self) -> String {
19        self.wrapper_object.file_name()
20    }
21
22    fn super_module_name(&self) -> Option<String> {
23        Some(self.wrapper_object.path().super_module_name)
24    }
25
26    fn str_src(&self) -> String {
27        Renderer::token_stream(self).to_string()
28    }
29}
30
31impl<'a, 'b> Renderer<'a, 'b> {
32    pub fn create_file(wrapper_object: &'a MutationsTypeWrapper<'a, 'b>) {
33        let obj = Self { wrapper_object };
34        obj.save(wrapper_object.context);
35    }
36
37    pub fn new_and_token_stream(wrapper_object: &'a MutationsTypeWrapper<'a, 'b>) -> TokenStream {
38        let obj = Self { wrapper_object };
39        obj.token_stream()
40    }
41
42    fn token_stream(&self) -> TokenStream {
43        let mutations = self.mutations_tokens();
44        let dependencies = self.dependencies_token();
45
46        quote!(
47            #dependencies
48
49            pub struct Mutation;
50            impl ResolveMutation for Mutation {}
51
52            #[Object]
53            impl Mutation {
54                #mutations
55            }
56        )
57    }
58
59    fn dependencies_token(&self) -> TokenStream {
60        let dep = Self::render_dependencies(
61            &self.wrapper_object.name(),
62            self.wrapper_object.dependencies(),
63        );
64        quote!(
65            use async_graphql::*;
66
67            #dep
68        )
69    }
70
71    fn resolver_body(f: &MutationTypeWrapper, arguments_variebles: &TokenStream) -> TokenStream {
72        let field_name = &f.field_name();
73        let method_name = format!("{}_resolver", field_name);
74        let method_name_token = Ident::new(&method_name, Span::call_site());
75        quote!(self.#method_name_token(#arguments_variebles))
76    }
77
78    fn arguments_token(f: &MutationTypeWrapper) -> TokenStream {
79        let mut res = quote!();
80        f.arguments().iter().for_each(|f| {
81            let code_type_name = Ident::new(&f.code_type_name(), Span::call_site());
82            let field_name = Ident::new(&f.field_name(), Span::call_site());
83            res = quote!(
84                #res
85                #field_name: #code_type_name,
86            );
87        });
88        res
89    }
90
91    fn arguments_variebles(f: &MutationTypeWrapper) -> TokenStream {
92        let mut res = quote!();
93        f.arguments().iter().for_each(|f| {
94            let field_name = Ident::new(&f.field_name(), Span::call_site());
95            res = quote!(
96                #res
97                #field_name,
98            );
99        });
100        res
101    }
102
103    fn mutations_tokens(&self) -> TokenStream {
104        let mut result = quote!();
105        self.wrapper_object.mutations().iter().for_each(|f| {
106            let name = Self::field_name_token(f);
107            let res = Self::struct_name_token(f);
108            let arguments_variebles = Self::arguments_variebles(f);
109            let resolver_body = Self::resolver_body(f, &arguments_variebles);
110            let arguments = Self::arguments_token(f);
111
112            result = quote!(
113                #result
114
115                async fn #name(&self, #arguments) -> #res {
116
117                    #resolver_body
118                }
119            );
120        });
121        result
122    }
123}