1 use tonic::{transport::Server, Request, Response, Status}; 2 3 pub mod hello_world { 4 tonic::include_proto!("helloworld"); 5 } 6 7 pub mod echo { 8 tonic::include_proto!("grpc.examples.unaryecho"); 9 } 10 11 use hello_world::{ 12 greeter_server::{Greeter, GreeterServer}, 13 HelloReply, HelloRequest, 14 }; 15 16 use echo::{ 17 echo_server::{Echo, EchoServer}, 18 EchoRequest, EchoResponse, 19 }; 20 21 #[tokio::main] 22 async fn main() -> Result<(), Box<dyn std::error::Error>> { 23 let addr = "[::1]:50051".parse().unwrap(); 24 25 let greeter = GreeterServer::new(MyGreeter::default()); 26 let echo = EchoServer::new(MyEcho::default()); 27 28 Server::builder() 29 .add_service(greeter) 30 .add_service(echo) 31 .serve(addr) 32 .await?; 33 34 Ok(()) 35 } 36 37 #[derive(Default)] 38 pub struct MyGreeter {} 39 40 #[tonic::async_trait] 41 impl Greeter for MyGreeter { 42 async fn say_hello( 43 &self, 44 request: Request<HelloRequest>, 45 ) -> Result<Response<HelloReply>, Status> { 46 let reply = hello_world::HelloReply { 47 message: format!("Hello {}!", request.into_inner().name), 48 }; 49 Ok(Response::new(reply)) 50 } 51 } 52 53 #[derive(Default)] 54 pub struct MyEcho; 55 56 #[tonic::async_trait] 57 impl Echo for MyEcho { 58 async fn unary_echo( 59 &self, 60 request: Request<EchoRequest>, 61 ) -> Result<Response<EchoResponse>, Status> { 62 let message = request.into_inner().message; 63 Ok(Response::new(EchoResponse { message })) 64 } 65 } 66