1 use std::env; 2 use tonic::{service::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.iter().any(|arg| arg.as_str() == "echo"); 36 if enabled { 37 println!("Adding Echo service..."); 38 let svc = EchoServer::new(MyEcho::default()); 39 builder.add_service(svc); 40 } 41 } 42 43 #[derive(Default)] 44 pub struct MyGreeter {} 45 46 #[tonic::async_trait] 47 impl Greeter for MyGreeter { 48 async fn say_hello( 49 &self, 50 request: Request<HelloRequest>, 51 ) -> Result<Response<HelloReply>, Status> { 52 println!("Got a greet request from {:?}", request.remote_addr()); 53 54 let reply = hello_world::HelloReply { 55 message: format!("Hello {}!", request.into_inner().name), 56 }; 57 Ok(Response::new(reply)) 58 } 59 } 60 61 fn init_greeter(args: &[String], builder: &mut RoutesBuilder) { 62 let enabled = args.iter().any(|arg| arg.as_str() == "greeter"); 63 64 if enabled { 65 println!("Adding Greeter service..."); 66 let svc = GreeterServer::new(MyGreeter::default()); 67 builder.add_service(svc); 68 } 69 } 70 71 #[tokio::main] 72 async fn main() -> Result<(), Box<dyn std::error::Error>> { 73 let args: Vec<String> = env::args().collect(); 74 let mut routes_builder = RoutesBuilder::default(); 75 init_greeter(&args, &mut routes_builder); 76 init_echo(&args, &mut routes_builder); 77 78 let addr = "[::1]:50051".parse().unwrap(); 79 80 println!("Grpc server listening on {}", addr); 81 82 Server::builder() 83 .add_routes(routes_builder.routes()) 84 .serve(addr) 85 .await?; 86 87 Ok(()) 88 } 89