fix(build): snake_case service names (#190)
This commit is contained in:
committed by
Lucio Franco
parent
82facb6283
commit
3a5c66d5f2
@@ -12,7 +12,7 @@ pub mod route_guide {
|
|||||||
tonic::include_proto!("routeguide");
|
tonic::include_proto!("routeguide");
|
||||||
}
|
}
|
||||||
|
|
||||||
use route_guide::routeguide_client::RouteGuideClient;
|
use route_guide::route_guide_client::RouteGuideClient;
|
||||||
|
|
||||||
async fn print_features(client: &mut RouteGuideClient<Channel>) -> Result<(), Box<dyn Error>> {
|
async fn print_features(client: &mut RouteGuideClient<Channel>) -> Result<(), Box<dyn Error>> {
|
||||||
let rectangle = Rectangle {
|
let rectangle = Rectangle {
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ pub mod routeguide {
|
|||||||
tonic::include_proto!("routeguide");
|
tonic::include_proto!("routeguide");
|
||||||
}
|
}
|
||||||
|
|
||||||
use routeguide::{routeguide_server, Feature, Point, Rectangle, RouteNote, RouteSummary};
|
use routeguide::{route_guide_server, Feature, Point, Rectangle, RouteNote, RouteSummary};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct RouteGuide {
|
pub struct RouteGuide {
|
||||||
@@ -22,7 +22,7 @@ pub struct RouteGuide {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[tonic::async_trait]
|
#[tonic::async_trait]
|
||||||
impl routeguide_server::RouteGuide for RouteGuide {
|
impl route_guide_server::RouteGuide for RouteGuide {
|
||||||
async fn get_feature(&self, request: Request<Point>) -> Result<Response<Feature>, Status> {
|
async fn get_feature(&self, request: Request<Point>) -> Result<Response<Feature>, Status> {
|
||||||
println!("GetFeature = {:?}", request);
|
println!("GetFeature = {:?}", request);
|
||||||
|
|
||||||
@@ -154,7 +154,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
features: Arc::new(data::load()),
|
features: Arc::new(data::load()),
|
||||||
};
|
};
|
||||||
|
|
||||||
let svc = routeguide_server::RouteGuideServer::new(route_guide);
|
let svc = route_guide_server::RouteGuideServer::new(route_guide);
|
||||||
|
|
||||||
Server::builder().add_service(svc).serve(addr).await?;
|
Server::builder().add_service(svc).serve(addr).await?;
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
pb::testservice_client::*, pb::unimplementedservice_client::*, pb::*, test_assert,
|
pb::test_service_client::*, pb::unimplemented_service_client::*, pb::*, test_assert,
|
||||||
TestAssertion,
|
TestAssertion,
|
||||||
};
|
};
|
||||||
use futures_util::{future, stream, StreamExt};
|
use futures_util::{future, stream, StreamExt};
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ use std::pin::Pin;
|
|||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use tonic::{Code, Request, Response, Status};
|
use tonic::{Code, Request, Response, Status};
|
||||||
|
|
||||||
pub use pb::testservice_server::TestServiceServer;
|
pub use pb::test_service_server::TestServiceServer;
|
||||||
pub use pb::unimplementedservice_server::UnimplementedServiceServer;
|
pub use pb::unimplemented_service_server::UnimplementedServiceServer;
|
||||||
|
|
||||||
#[derive(Default, Clone)]
|
#[derive(Default, Clone)]
|
||||||
pub struct TestService;
|
pub struct TestService;
|
||||||
@@ -18,7 +18,7 @@ type Stream<T> = Pin<
|
|||||||
>;
|
>;
|
||||||
|
|
||||||
#[tonic::async_trait]
|
#[tonic::async_trait]
|
||||||
impl pb::testservice_server::TestService for TestService {
|
impl pb::test_service_server::TestService for TestService {
|
||||||
async fn empty_call(&self, _request: Request<Empty>) -> Result<Empty> {
|
async fn empty_call(&self, _request: Request<Empty>) -> Result<Empty> {
|
||||||
Ok(Response::new(Empty {}))
|
Ok(Response::new(Empty {}))
|
||||||
}
|
}
|
||||||
@@ -154,7 +154,7 @@ impl pb::testservice_server::TestService for TestService {
|
|||||||
pub struct UnimplementedService;
|
pub struct UnimplementedService;
|
||||||
|
|
||||||
#[tonic::async_trait]
|
#[tonic::async_trait]
|
||||||
impl pb::unimplementedservice_server::UnimplementedService for UnimplementedService {
|
impl pb::unimplemented_service_server::UnimplementedService for UnimplementedService {
|
||||||
async fn unimplemented_call(&self, _req: Request<Empty>) -> Result<Empty> {
|
async fn unimplemented_call(&self, _req: Request<Empty>) -> Result<Empty> {
|
||||||
Err(Status::unimplemented(""))
|
Err(Status::unimplemented(""))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,4 +5,4 @@ pub mod pb {
|
|||||||
// Ensure that an RPC service, defined before including a file that defines
|
// Ensure that an RPC service, defined before including a file that defines
|
||||||
// another service in a different protocol buffer package, is not incorrectly
|
// another service in a different protocol buffer package, is not incorrectly
|
||||||
// cleared from the context of its package.
|
// cleared from the context of its package.
|
||||||
type _Test = dyn pb::topservice_server::TopService;
|
type _Test = dyn pb::top_service_server::TopService;
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
use crate::generate_doc_comments;
|
use crate::{generate_doc_comments, naive_snake_case};
|
||||||
use proc_macro2::TokenStream;
|
use proc_macro2::TokenStream;
|
||||||
use prost_build::{Method, Service};
|
use prost_build::{Method, Service};
|
||||||
use quote::{format_ident, quote};
|
use quote::{format_ident, quote};
|
||||||
|
|
||||||
pub(crate) fn generate(service: &Service, proto: &str) -> TokenStream {
|
pub(crate) fn generate(service: &Service, proto: &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", service.name.to_ascii_lowercase());
|
let client_mod = quote::format_ident!("{}_client", naive_snake_case(&service.name));
|
||||||
let methods = generate_methods(service, proto);
|
let methods = generate_methods(service, proto);
|
||||||
|
|
||||||
let connect = generate_connect(&service_ident);
|
let connect = generate_connect(&service_ident);
|
||||||
|
|||||||
@@ -321,3 +321,31 @@ fn replace_wellknown(proto_path: &str, method: &Method) -> (TokenStream, TokenSt
|
|||||||
|
|
||||||
(request, response)
|
(request, response)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn naive_snake_case(name: &str) -> String {
|
||||||
|
let mut s = String::new();
|
||||||
|
let mut it = name.chars().peekable();
|
||||||
|
|
||||||
|
while let Some(x) = it.next() {
|
||||||
|
s.push(x.to_ascii_lowercase());
|
||||||
|
if let Some(y) = it.peek() {
|
||||||
|
if y.is_uppercase() {
|
||||||
|
s.push('_');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
s
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_snake_case() {
|
||||||
|
for case in &[
|
||||||
|
("Service", "service"),
|
||||||
|
("ThatHasALongName", "that_has_a_long_name"),
|
||||||
|
("greeter", "greeter"),
|
||||||
|
("ABCServiceX", "a_b_c_service_x"),
|
||||||
|
] {
|
||||||
|
assert_eq!(naive_snake_case(case.0), case.1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use crate::{generate_doc_comment, generate_doc_comments};
|
use crate::{generate_doc_comment, generate_doc_comments, naive_snake_case};
|
||||||
use proc_macro2::{Span, TokenStream};
|
use proc_macro2::{Span, TokenStream};
|
||||||
use prost_build::{Method, Service};
|
use prost_build::{Method, Service};
|
||||||
use quote::quote;
|
use quote::quote;
|
||||||
@@ -9,7 +9,7 @@ pub(crate) fn generate(service: &Service, proto_path: &str) -> TokenStream {
|
|||||||
|
|
||||||
let server_service = quote::format_ident!("{}Server", service.name);
|
let server_service = quote::format_ident!("{}Server", service.name);
|
||||||
let server_trait = quote::format_ident!("{}", service.name);
|
let server_trait = quote::format_ident!("{}", service.name);
|
||||||
let server_mod = quote::format_ident!("{}_server", service.name.to_ascii_lowercase());
|
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.comments.leading);
|
let service_doc = generate_doc_comments(&service.comments.leading);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user