1 use std::env; 2 use tonic::{transport::server::RoutesBuilder, transport::Server, Request, Response, Status}; 3 4 use hello_world::greeter_server::{Greeter, GreeterServer}; 5 use hello_world::{HelloReply, HelloRequest}; 6 7 use echo::echo_server::{Echo, EchoServer}; 8 use echo::{EchoRequest, EchoResponse}; 9 10 pub mod hello_world { 11 tonic::include_proto!("helloworld"); 12 } 13 14 pub mod echo { 15 tonic::include_proto!("grpc.examples.unaryecho"); 16 } 17 18 type EchoResult<T> = Result<Response<T>, Status>; 19 20 #[derive(Default)] 21 pub struct MyEcho {} 22 23 #[tonic::async_trait] 24 impl Echo for MyEcho { 25 async fn unary_echo(&self, request: Request<EchoRequest>) -> EchoResult<EchoResponse> { 26 println!("Got an echo request from {:?}", request.remote_addr()); 27 28 let message = format!("you said: {}", request.into_inner().message); 29 30 Ok(Response::new(EchoResponse { message })) 31 } 32 } 33 34 fn init_echo(args: &[String], builder: &mut RoutesBuilder) { 35 let enabled = args 36 .into_iter() 37 .find(|arg| arg.as_str() == "echo") 38 .is_some(); 39 if enabled { 40 println!("Adding Echo service..."); 41 let svc = EchoServer::new(MyEcho::default()); 42 builder.add_service(svc); 43 } 44 } 45 46 #[derive(Default)] 47 pub struct MyGreeter {} 48 49 #[tonic::async_trait] 50 impl Greeter for MyGreeter { 51 async fn say_hello( 52 &self, 53 request: Request<HelloRequest>, 54 ) -> Result<Response<HelloReply>, Status> { 55 println!("Got a greet request from {:?}", request.remote_addr()); 56 57 let reply = hello_world::HelloReply { 58 message: format!("Hello {}!", request.into_inner().name), 59 }; 60 Ok(Response::new(reply)) 61 } 62 } 63 64 fn init_greeter(args: &[String], builder: &mut RoutesBuilder) { 65 let enabled = args 66 .into_iter() 67 .find(|arg| arg.as_str() == "greeter") 68 .is_some(); 69 70 if enabled { 71 println!("Adding Greeter service..."); 72 let svc = GreeterServer::new(MyGreeter::default()); 73 builder.add_service(svc); 74 } 75 } 76 77 #[tokio::main] 78 async fn main() -> Result<(), Box<dyn std::error::Error>> { 79 let args: Vec<String> = env::args().collect(); 80 let mut routes_builder = RoutesBuilder::default(); 81 init_greeter(&args, &mut routes_builder); 82 init_echo(&args, &mut routes_builder); 83 84 let addr = "[::1]:50051".parse().unwrap(); 85 86 println!("Grpc server listening on {}", addr); 87 88 Server::builder() 89 .add_routes(routes_builder.routes()) 90 .serve(addr) 91 .await?; 92 93 Ok(()) 94 } 95