feat(build): Add disable_package_emission option to tonic-build (#556)
This commit is contained in:
@@ -7,10 +7,10 @@ use quote::{format_ident, quote};
|
|||||||
///
|
///
|
||||||
/// This takes some `Service` and will generate a `TokenStream` that contains
|
/// This takes some `Service` and will generate a `TokenStream` that contains
|
||||||
/// a public module with the generated client.
|
/// a public module with the generated client.
|
||||||
pub fn generate<T: Service>(service: &T, proto_path: &str) -> TokenStream {
|
pub fn generate<T: Service>(service: &T, emit_package: bool, proto_path: &str) -> TokenStream {
|
||||||
let service_ident = quote::format_ident!("{}Client", service.name());
|
let service_ident = quote::format_ident!("{}Client", service.name());
|
||||||
let client_mod = quote::format_ident!("{}_client", naive_snake_case(&service.name()));
|
let client_mod = quote::format_ident!("{}_client", naive_snake_case(&service.name()));
|
||||||
let methods = generate_methods(service, proto_path);
|
let methods = generate_methods(service, emit_package, proto_path);
|
||||||
|
|
||||||
let connect = generate_connect(&service_ident);
|
let connect = generate_connect(&service_ident);
|
||||||
let service_doc = generate_doc_comments(service.comment());
|
let service_doc = generate_doc_comments(service.comment());
|
||||||
@@ -87,18 +87,15 @@ fn generate_connect(_service_ident: &syn::Ident) -> TokenStream {
|
|||||||
TokenStream::new()
|
TokenStream::new()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn generate_methods<T: Service>(service: &T, proto_path: &str) -> TokenStream {
|
fn generate_methods<T: Service>(service: &T, emit_package: bool, proto_path: &str) -> TokenStream {
|
||||||
let mut stream = TokenStream::new();
|
let mut stream = TokenStream::new();
|
||||||
|
let package = if emit_package { service.package() } else { "" };
|
||||||
|
|
||||||
for method in service.methods() {
|
for method in service.methods() {
|
||||||
let path = format!(
|
let path = format!(
|
||||||
"/{}{}{}/{}",
|
"/{}{}{}/{}",
|
||||||
service.package(),
|
package,
|
||||||
if service.package().is_empty() {
|
if package.is_empty() { "" } else { "." },
|
||||||
""
|
|
||||||
} else {
|
|
||||||
"."
|
|
||||||
},
|
|
||||||
service.identifier(),
|
service.identifier(),
|
||||||
method.identifier()
|
method.identifier()
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ pub fn configure() -> Builder {
|
|||||||
proto_path: "super".to_string(),
|
proto_path: "super".to_string(),
|
||||||
#[cfg(feature = "rustfmt")]
|
#[cfg(feature = "rustfmt")]
|
||||||
format: true,
|
format: true,
|
||||||
|
emit_package: true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,12 +137,20 @@ impl ServiceGenerator {
|
|||||||
impl prost_build::ServiceGenerator for ServiceGenerator {
|
impl prost_build::ServiceGenerator for ServiceGenerator {
|
||||||
fn generate(&mut self, service: prost_build::Service, _buf: &mut String) {
|
fn generate(&mut self, service: prost_build::Service, _buf: &mut String) {
|
||||||
if self.builder.build_server {
|
if self.builder.build_server {
|
||||||
let server = server::generate(&service, &self.builder.proto_path);
|
let server = server::generate(
|
||||||
|
&service,
|
||||||
|
self.builder.emit_package,
|
||||||
|
&self.builder.proto_path,
|
||||||
|
);
|
||||||
self.servers.extend(server);
|
self.servers.extend(server);
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.builder.build_client {
|
if self.builder.build_client {
|
||||||
let client = client::generate(&service, &self.builder.proto_path);
|
let client = client::generate(
|
||||||
|
&service,
|
||||||
|
self.builder.emit_package,
|
||||||
|
&self.builder.proto_path,
|
||||||
|
);
|
||||||
self.clients.extend(client);
|
self.clients.extend(client);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -184,6 +193,7 @@ pub struct Builder {
|
|||||||
pub(crate) field_attributes: Vec<(String, String)>,
|
pub(crate) field_attributes: Vec<(String, String)>,
|
||||||
pub(crate) type_attributes: Vec<(String, String)>,
|
pub(crate) type_attributes: Vec<(String, String)>,
|
||||||
pub(crate) proto_path: String,
|
pub(crate) proto_path: String,
|
||||||
|
pub(crate) emit_package: bool,
|
||||||
|
|
||||||
out_dir: Option<PathBuf>,
|
out_dir: Option<PathBuf>,
|
||||||
#[cfg(feature = "rustfmt")]
|
#[cfg(feature = "rustfmt")]
|
||||||
@@ -258,6 +268,14 @@ impl Builder {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Emits GRPC endpoints with no attached package. Effectively ignores protofile package declaration from grpc context.
|
||||||
|
///
|
||||||
|
/// This effectively sets prost's exported package to an empty string.
|
||||||
|
pub fn disable_package_emission(mut self) -> Self {
|
||||||
|
self.emit_package = false;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Compile the .proto files and execute code generation.
|
/// Compile the .proto files and execute code generation.
|
||||||
pub fn compile<P>(self, protos: &[P], includes: &[P]) -> io::Result<()>
|
pub fn compile<P>(self, protos: &[P], includes: &[P]) -> io::Result<()>
|
||||||
where
|
where
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ use syn::{Ident, Lit, LitStr};
|
|||||||
///
|
///
|
||||||
/// This takes some `Service` and will generate a `TokenStream` that contains
|
/// This takes some `Service` and will generate a `TokenStream` that contains
|
||||||
/// a public module containing the server service and handler trait.
|
/// a public module containing the server service and handler trait.
|
||||||
pub fn generate<T: Service>(service: &T, proto_path: &str) -> TokenStream {
|
pub fn generate<T: Service>(service: &T, emit_package: bool, proto_path: &str) -> TokenStream {
|
||||||
let methods = generate_methods(service, proto_path);
|
let methods = generate_methods(service, proto_path);
|
||||||
|
|
||||||
let server_service = quote::format_ident!("{}Server", service.name());
|
let server_service = quote::format_ident!("{}Server", service.name());
|
||||||
@@ -16,16 +16,12 @@ pub fn generate<T: Service>(service: &T, proto_path: &str) -> TokenStream {
|
|||||||
let server_mod = quote::format_ident!("{}_server", naive_snake_case(&service.name()));
|
let server_mod = quote::format_ident!("{}_server", naive_snake_case(&service.name()));
|
||||||
let generated_trait = generate_trait(service, proto_path, server_trait.clone());
|
let generated_trait = generate_trait(service, proto_path, server_trait.clone());
|
||||||
let service_doc = generate_doc_comments(service.comment());
|
let service_doc = generate_doc_comments(service.comment());
|
||||||
|
let package = if emit_package { service.package() } else { "" };
|
||||||
// Transport based implementations
|
// Transport based implementations
|
||||||
let path = format!(
|
let path = format!(
|
||||||
"{}{}{}",
|
"{}{}{}",
|
||||||
service.package(),
|
package,
|
||||||
if service.package().is_empty() {
|
if package.is_empty() { "" } else { "." },
|
||||||
""
|
|
||||||
} else {
|
|
||||||
"."
|
|
||||||
},
|
|
||||||
service.identifier()
|
service.identifier()
|
||||||
);
|
);
|
||||||
let transport = generate_transport(&server_service, &server_trait, &path);
|
let transport = generate_transport(&server_service, &server_trait, &path);
|
||||||
|
|||||||
Reference in New Issue
Block a user