Skip to content

Commit 4f5e160

Browse files
authored
feat(build): Add disable_package_emission option to tonic-build (#556)
1 parent ca3b9a1 commit 4f5e160

File tree

3 files changed

+30
-19
lines changed

3 files changed

+30
-19
lines changed

tonic-build/src/client.rs

+6-9
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ use quote::{format_ident, quote};
77
///
88
/// This takes some `Service` and will generate a `TokenStream` that contains
99
/// a public module with the generated client.
10-
pub fn generate<T: Service>(service: &T, proto_path: &str) -> TokenStream {
10+
pub fn generate<T: Service>(service: &T, emit_package: bool, proto_path: &str) -> TokenStream {
1111
let service_ident = quote::format_ident!("{}Client", service.name());
1212
let client_mod = quote::format_ident!("{}_client", naive_snake_case(&service.name()));
13-
let methods = generate_methods(service, proto_path);
13+
let methods = generate_methods(service, emit_package, proto_path);
1414

1515
let connect = generate_connect(&service_ident);
1616
let service_doc = generate_doc_comments(service.comment());
@@ -87,18 +87,15 @@ fn generate_connect(_service_ident: &syn::Ident) -> TokenStream {
8787
TokenStream::new()
8888
}
8989

90-
fn generate_methods<T: Service>(service: &T, proto_path: &str) -> TokenStream {
90+
fn generate_methods<T: Service>(service: &T, emit_package: bool, proto_path: &str) -> TokenStream {
9191
let mut stream = TokenStream::new();
92+
let package = if emit_package { service.package() } else { "" };
9293

9394
for method in service.methods() {
9495
let path = format!(
9596
"/{}{}{}/{}",
96-
service.package(),
97-
if service.package().is_empty() {
98-
""
99-
} else {
100-
"."
101-
},
97+
package,
98+
if package.is_empty() { "" } else { "." },
10299
service.identifier(),
103100
method.identifier()
104101
);

tonic-build/src/prost.rs

+20-2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ pub fn configure() -> Builder {
1919
proto_path: "super".to_string(),
2020
#[cfg(feature = "rustfmt")]
2121
format: true,
22+
emit_package: true,
2223
}
2324
}
2425

@@ -136,12 +137,20 @@ impl ServiceGenerator {
136137
impl prost_build::ServiceGenerator for ServiceGenerator {
137138
fn generate(&mut self, service: prost_build::Service, _buf: &mut String) {
138139
if self.builder.build_server {
139-
let server = server::generate(&service, &self.builder.proto_path);
140+
let server = server::generate(
141+
&service,
142+
self.builder.emit_package,
143+
&self.builder.proto_path,
144+
);
140145
self.servers.extend(server);
141146
}
142147

143148
if self.builder.build_client {
144-
let client = client::generate(&service, &self.builder.proto_path);
149+
let client = client::generate(
150+
&service,
151+
self.builder.emit_package,
152+
&self.builder.proto_path,
153+
);
145154
self.clients.extend(client);
146155
}
147156
}
@@ -184,6 +193,7 @@ pub struct Builder {
184193
pub(crate) field_attributes: Vec<(String, String)>,
185194
pub(crate) type_attributes: Vec<(String, String)>,
186195
pub(crate) proto_path: String,
196+
pub(crate) emit_package: bool,
187197

188198
out_dir: Option<PathBuf>,
189199
#[cfg(feature = "rustfmt")]
@@ -258,6 +268,14 @@ impl Builder {
258268
self
259269
}
260270

271+
/// Emits GRPC endpoints with no attached package. Effectively ignores protofile package declaration from grpc context.
272+
///
273+
/// This effectively sets prost's exported package to an empty string.
274+
pub fn disable_package_emission(mut self) -> Self {
275+
self.emit_package = false;
276+
self
277+
}
278+
261279
/// Compile the .proto files and execute code generation.
262280
pub fn compile<P>(self, protos: &[P], includes: &[P]) -> io::Result<()>
263281
where

tonic-build/src/server.rs

+4-8
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,20 @@ use syn::{Ident, Lit, LitStr};
88
///
99
/// This takes some `Service` and will generate a `TokenStream` that contains
1010
/// a public module containing the server service and handler trait.
11-
pub fn generate<T: Service>(service: &T, proto_path: &str) -> TokenStream {
11+
pub fn generate<T: Service>(service: &T, emit_package: bool, proto_path: &str) -> TokenStream {
1212
let methods = generate_methods(service, proto_path);
1313

1414
let server_service = quote::format_ident!("{}Server", service.name());
1515
let server_trait = quote::format_ident!("{}", service.name());
1616
let server_mod = quote::format_ident!("{}_server", naive_snake_case(&service.name()));
1717
let generated_trait = generate_trait(service, proto_path, server_trait.clone());
1818
let service_doc = generate_doc_comments(service.comment());
19-
19+
let package = if emit_package { service.package() } else { "" };
2020
// Transport based implementations
2121
let path = format!(
2222
"{}{}{}",
23-
service.package(),
24-
if service.package().is_empty() {
25-
""
26-
} else {
27-
"."
28-
},
23+
package,
24+
if package.is_empty() { "" } else { "." },
2925
service.identifier()
3026
);
3127
let transport = generate_transport(&server_service, &server_trait, &path);

0 commit comments

Comments
 (0)