chore(build): Refactor codegen traits (#302)

Signed-off-by: Lucio Franco <[email protected]>
This commit is contained in:
Lucio Franco
2020-03-29 12:57:11 -04:00
committed by GitHub
parent 012fa3cb4a
commit 2e082f8b3e
13 changed files with 113 additions and 144 deletions
+29 -33
View File
@@ -1,17 +1,17 @@
use super::schema::{Commentable, Context, Method, Service};
use super::schema::{Commentable, Method, Service};
use crate::{generate_doc_comment, generate_doc_comments, naive_snake_case};
use proc_macro2::{Span, TokenStream};
use quote::quote;
use syn::{Ident, Lit, LitStr};
/// Generate service for Server
pub fn generate<'a, T: Service<'a>>(service: &'a T, context: &T::Context) -> TokenStream {
let methods = generate_methods(service, context);
pub fn generate<T: Service>(service: &T, proto_path: &str) -> TokenStream {
let methods = generate_methods(service, proto_path);
let server_service = quote::format_ident!("{}Server", service.name());
let server_trait = quote::format_ident!("{}", service.name());
let server_mod = quote::format_ident!("{}_server", naive_snake_case(&service.name()));
let generated_trait = generate_trait(service, context, server_trait.clone());
let generated_trait = generate_trait(service, proto_path, server_trait.clone());
let service_doc = generate_doc_comments(service.comment());
// Transport based implementations
@@ -104,12 +104,8 @@ pub fn generate<'a, T: Service<'a>>(service: &'a T, context: &T::Context) -> Tok
}
}
fn generate_trait<'a, T: Service<'a>>(
service: &'a T,
context: &T::Context,
server_trait: Ident,
) -> TokenStream {
let methods = generate_trait_methods(service, context);
fn generate_trait<T: Service>(service: &T, proto_path: &str, server_trait: Ident) -> TokenStream {
let methods = generate_trait_methods(service, proto_path);
let trait_doc = generate_doc_comment(&format!(
"Generated trait containing gRPC methods that should be implemented for use with {}Server.",
service.name()
@@ -124,13 +120,13 @@ fn generate_trait<'a, T: Service<'a>>(
}
}
fn generate_trait_methods<'a, T: Service<'a>>(service: &'a T, context: &T::Context) -> TokenStream {
fn generate_trait_methods<T: Service>(service: &T, proto_path: &str) -> TokenStream {
let mut stream = TokenStream::new();
for method in service.methods() {
let name = quote::format_ident!("{}", method.name());
let (req_message, res_message) = method.request_response_name(context);
let (req_message, res_message) = method.request_response_name(proto_path);
let method_doc = generate_doc_comments(method.comment());
@@ -213,7 +209,7 @@ fn generate_transport(
TokenStream::new()
}
fn generate_methods<'a, T: Service<'a>>(service: &'a T, context: &T::Context) -> TokenStream {
fn generate_methods<T: Service>(service: &T, proto_path: &str) -> TokenStream {
let mut stream = TokenStream::new();
for method in service.methods() {
@@ -228,16 +224,16 @@ fn generate_methods<'a, T: Service<'a>>(service: &'a T, context: &T::Context) ->
let server_trait = quote::format_ident!("{}", service.name());
let method_stream = match (method.client_streaming(), method.server_streaming()) {
(false, false) => generate_unary(method, ident, context, server_trait),
(false, false) => generate_unary(method, proto_path, ident, server_trait),
(false, true) => {
generate_server_streaming(method, ident.clone(), context, server_trait)
generate_server_streaming(method, proto_path, ident.clone(), server_trait)
}
(true, false) => {
generate_client_streaming(method, ident.clone(), context, server_trait)
generate_client_streaming(method, proto_path, ident.clone(), server_trait)
}
(true, true) => generate_streaming(method, ident.clone(), context, server_trait),
(true, true) => generate_streaming(method, proto_path, ident.clone(), server_trait),
};
let method = quote! {
@@ -251,17 +247,17 @@ fn generate_methods<'a, T: Service<'a>>(service: &'a T, context: &T::Context) ->
stream
}
fn generate_unary<'a, T: Method<'a>>(
fn generate_unary<T: Method>(
method: &T,
proto_path: &str,
method_ident: Ident,
context: &T::Context,
server_trait: Ident,
) -> TokenStream {
let codec_name = syn::parse_str::<syn::Path>(context.codec_name()).unwrap();
let codec_name = syn::parse_str::<syn::Path>(T::CODEC_PATH).unwrap();
let service_ident = quote::format_ident!("{}Svc", method.identifier());
let (request, response) = method.request_response_name(context);
let (request, response) = method.request_response_name(proto_path);
quote! {
#[allow(non_camel_case_types)]
@@ -301,17 +297,17 @@ fn generate_unary<'a, T: Method<'a>>(
}
}
fn generate_server_streaming<'a, T: Method<'a>>(
fn generate_server_streaming<T: Method>(
method: &T,
proto_path: &str,
method_ident: Ident,
context: &T::Context,
server_trait: Ident,
) -> TokenStream {
let codec_name = syn::parse_str::<syn::Path>(context.codec_name()).unwrap();
let codec_name = syn::parse_str::<syn::Path>(T::CODEC_PATH).unwrap();
let service_ident = quote::format_ident!("{}Svc", method.identifier());
let (request, response) = method.request_response_name(context);
let (request, response) = method.request_response_name(proto_path);
let response_stream = quote::format_ident!("{}Stream", method.identifier());
@@ -355,16 +351,16 @@ fn generate_server_streaming<'a, T: Method<'a>>(
}
}
fn generate_client_streaming<'a, T: Method<'a>>(
fn generate_client_streaming<T: Method>(
method: &T,
proto_path: &str,
method_ident: Ident,
context: &T::Context,
server_trait: Ident,
) -> TokenStream {
let service_ident = quote::format_ident!("{}Svc", method.identifier());
let (request, response) = method.request_response_name(context);
let codec_name = syn::parse_str::<syn::Path>(context.codec_name()).unwrap();
let (request, response) = method.request_response_name(proto_path);
let codec_name = syn::parse_str::<syn::Path>(T::CODEC_PATH).unwrap();
quote! {
#[allow(non_camel_case_types)]
@@ -406,17 +402,17 @@ fn generate_client_streaming<'a, T: Method<'a>>(
}
}
fn generate_streaming<'a, T: Method<'a>>(
fn generate_streaming<T: Method>(
method: &T,
proto_path: &str,
method_ident: Ident,
context: &T::Context,
server_trait: Ident,
) -> TokenStream {
let codec_name = syn::parse_str::<syn::Path>(context.codec_name()).unwrap();
let codec_name = syn::parse_str::<syn::Path>(T::CODEC_PATH).unwrap();
let service_ident = quote::format_ident!("{}Svc", method.identifier());
let (request, response) = method.request_response_name(context);
let (request, response) = method.request_response_name(proto_path);
let response_stream = quote::format_ident!("{}Stream", method.identifier());