kanamaru_build/prost/
codegen.rs

1use std::collections::HashSet;
2
3use quote::{quote, ToTokens};
4use responder::GenerateResponderService;
5use traits::GenerateTraitService;
6
7use crate::utils::{format_service_name, naive_snake_case, Attributes, Service};
8
9pub mod responder;
10pub mod traits;
11
12pub struct CodegenResponderBuilder<'a, S> {
13    pub service: &'a S,
14    pub emit_package: bool,
15    pub proto_path: &'a str,
16    pub compile_well_known_types: bool,
17    pub use_arc_self: bool,
18    pub generate_default_stubs: bool,
19    pub attributes: &'a Attributes,
20    pub disabled_comments: &'a HashSet<String>,
21}
22
23impl<S: Service> ToTokens for CodegenResponderBuilder<'_, S> {
24    fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
25        let service_responder = quote::format_ident!("{}Responder", self.service.name());
26        let service_trait = quote::format_ident!("{}", self.service.name());
27        let service_mod =
28            quote::format_ident!("{}_responder", naive_snake_case(self.service.name()));
29        let package = if self.emit_package {
30            self.service.package()
31        } else {
32            ""
33        };
34        let service_name = format_service_name(self.service, self.emit_package);
35        let mod_attributes = self.attributes.for_mod(package);
36
37        let _trait = GenerateTraitService {
38            service: self.service,
39            emit_package: self.emit_package,
40            proto_path: self.proto_path,
41            compile_well_known_types: self.compile_well_known_types,
42            service_trait: service_trait.clone(),
43            disable_comments: self.disabled_comments,
44            use_arc_self: self.use_arc_self,
45            generate_default_stubs: self.generate_default_stubs,
46        };
47        let responder = GenerateResponderService {
48            service: self.service,
49            emit_package: self.emit_package,
50            proto_path: self.proto_path,
51            compile_well_known_types: self.compile_well_known_types,
52            use_arc_self: self.use_arc_self,
53            generate_default_stubs: self.generate_default_stubs,
54            responder_service: service_responder,
55            service_trait,
56            attributes: self.attributes.for_struct(&service_name),
57            disabled_comments: self.disabled_comments,
58        };
59        let res = quote! {
60            /// Generated responder implementations.
61            #(#mod_attributes)*
62            pub mod #service_mod {
63                #![allow(
64                    unused_variables,
65                    dead_code,
66                    missing_docs,
67                    clippy::wildcard_imports
68                )]
69                use kanamaru::codegen::*;
70
71                #_trait
72
73                #responder
74            }
75        };
76        tokens.extend(res);
77    }
78}