kanamaru_build/prost/
codegen.rs1use 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 #(#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}