Skip to content

Commit 3a5c66d

Browse files
alceLucioFranco
authored andcommitted
fix(build): snake_case service names (#190)
1 parent 82facb6 commit 3a5c66d

File tree

8 files changed

+42
-14
lines changed

8 files changed

+42
-14
lines changed

examples/src/routeguide/client.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ pub mod route_guide {
1212
tonic::include_proto!("routeguide");
1313
}
1414

15-
use route_guide::routeguide_client::RouteGuideClient;
15+
use route_guide::route_guide_client::RouteGuideClient;
1616

1717
async fn print_features(client: &mut RouteGuideClient<Channel>) -> Result<(), Box<dyn Error>> {
1818
let rectangle = Rectangle {

examples/src/routeguide/server.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@ pub mod routeguide {
1414
tonic::include_proto!("routeguide");
1515
}
1616

17-
use routeguide::{routeguide_server, Feature, Point, Rectangle, RouteNote, RouteSummary};
17+
use routeguide::{route_guide_server, Feature, Point, Rectangle, RouteNote, RouteSummary};
1818

1919
#[derive(Debug)]
2020
pub struct RouteGuide {
2121
features: Arc<Vec<Feature>>,
2222
}
2323

2424
#[tonic::async_trait]
25-
impl routeguide_server::RouteGuide for RouteGuide {
25+
impl route_guide_server::RouteGuide for RouteGuide {
2626
async fn get_feature(&self, request: Request<Point>) -> Result<Response<Feature>, Status> {
2727
println!("GetFeature = {:?}", request);
2828

@@ -154,7 +154,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
154154
features: Arc::new(data::load()),
155155
};
156156

157-
let svc = routeguide_server::RouteGuideServer::new(route_guide);
157+
let svc = route_guide_server::RouteGuideServer::new(route_guide);
158158

159159
Server::builder().add_service(svc).serve(addr).await?;
160160

interop/src/client.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::{
2-
pb::testservice_client::*, pb::unimplementedservice_client::*, pb::*, test_assert,
2+
pb::test_service_client::*, pb::unimplemented_service_client::*, pb::*, test_assert,
33
TestAssertion,
44
};
55
use futures_util::{future, stream, StreamExt};

interop/src/server.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ use std::pin::Pin;
55
use std::time::Duration;
66
use tonic::{Code, Request, Response, Status};
77

8-
pub use pb::testservice_server::TestServiceServer;
9-
pub use pb::unimplementedservice_server::UnimplementedServiceServer;
8+
pub use pb::test_service_server::TestServiceServer;
9+
pub use pb::unimplemented_service_server::UnimplementedServiceServer;
1010

1111
#[derive(Default, Clone)]
1212
pub struct TestService;
@@ -18,7 +18,7 @@ type Stream<T> = Pin<
1818
>;
1919

2020
#[tonic::async_trait]
21-
impl pb::testservice_server::TestService for TestService {
21+
impl pb::test_service_server::TestService for TestService {
2222
async fn empty_call(&self, _request: Request<Empty>) -> Result<Empty> {
2323
Ok(Response::new(Empty {}))
2424
}
@@ -154,7 +154,7 @@ impl pb::testservice_server::TestService for TestService {
154154
pub struct UnimplementedService;
155155

156156
#[tonic::async_trait]
157-
impl pb::unimplementedservice_server::UnimplementedService for UnimplementedService {
157+
impl pb::unimplemented_service_server::UnimplementedService for UnimplementedService {
158158
async fn unimplemented_call(&self, _req: Request<Empty>) -> Result<Empty> {
159159
Err(Status::unimplemented(""))
160160
}

tests/included_service/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@ pub mod pb {
55
// Ensure that an RPC service, defined before including a file that defines
66
// another service in a different protocol buffer package, is not incorrectly
77
// cleared from the context of its package.
8-
type _Test = dyn pb::topservice_server::TopService;
8+
type _Test = dyn pb::top_service_server::TopService;

tonic-build/src/client.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
use crate::generate_doc_comments;
1+
use crate::{generate_doc_comments, naive_snake_case};
22
use proc_macro2::TokenStream;
33
use prost_build::{Method, Service};
44
use quote::{format_ident, quote};
55

66
pub(crate) fn generate(service: &Service, proto: &str) -> TokenStream {
77
let service_ident = quote::format_ident!("{}Client", service.name);
8-
let client_mod = quote::format_ident!("{}_client", service.name.to_ascii_lowercase());
8+
let client_mod = quote::format_ident!("{}_client", naive_snake_case(&service.name));
99
let methods = generate_methods(service, proto);
1010

1111
let connect = generate_connect(&service_ident);

tonic-build/src/lib.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,3 +321,31 @@ fn replace_wellknown(proto_path: &str, method: &Method) -> (TokenStream, TokenSt
321321

322322
(request, response)
323323
}
324+
325+
fn naive_snake_case(name: &str) -> String {
326+
let mut s = String::new();
327+
let mut it = name.chars().peekable();
328+
329+
while let Some(x) = it.next() {
330+
s.push(x.to_ascii_lowercase());
331+
if let Some(y) = it.peek() {
332+
if y.is_uppercase() {
333+
s.push('_');
334+
}
335+
}
336+
}
337+
338+
s
339+
}
340+
341+
#[test]
342+
fn test_snake_case() {
343+
for case in &[
344+
("Service", "service"),
345+
("ThatHasALongName", "that_has_a_long_name"),
346+
("greeter", "greeter"),
347+
("ABCServiceX", "a_b_c_service_x"),
348+
] {
349+
assert_eq!(naive_snake_case(case.0), case.1)
350+
}
351+
}

tonic-build/src/server.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::{generate_doc_comment, generate_doc_comments};
1+
use crate::{generate_doc_comment, generate_doc_comments, naive_snake_case};
22
use proc_macro2::{Span, TokenStream};
33
use prost_build::{Method, Service};
44
use quote::quote;
@@ -9,7 +9,7 @@ pub(crate) fn generate(service: &Service, proto_path: &str) -> TokenStream {
99

1010
let server_service = quote::format_ident!("{}Server", service.name);
1111
let server_trait = quote::format_ident!("{}", service.name);
12-
let server_mod = quote::format_ident!("{}_server", service.name.to_ascii_lowercase());
12+
let server_mod = quote::format_ident!("{}_server", naive_snake_case(&service.name));
1313
let generated_trait = generate_trait(service, proto_path, server_trait.clone());
1414
let service_doc = generate_doc_comments(&service.comments.leading);
1515

0 commit comments

Comments
 (0)