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