1 use tonic::{transport::Server, Request, Response, Status}; 2 3 use hello_world::greeter_server::{Greeter, GreeterServer}; 4 use hello_world::{HelloReply, HelloRequest}; 5 6 use tokio::runtime::Runtime; 7 8 pub mod hello_world { 9 tonic::include_proto!("helloworld"); 10 } 11 12 #[derive(Debug, Default)] 13 pub struct MyGreeter {} 14 15 #[tonic::async_trait] 16 impl Greeter for MyGreeter { 17 async fn say_hello( 18 &self, 19 request: Request<HelloRequest>, 20 ) -> Result<Response<HelloReply>, Status> { 21 println!("Got a request: {:?}", request); 22 23 let reply = hello_world::HelloReply { 24 message: format!("Hello {}!", request.into_inner().name), 25 }; 26 27 Ok(Response::new(reply)) 28 } 29 } 30 31 fn main() { 32 let addr = "[::1]:50051".parse().unwrap(); 33 let greeter = MyGreeter::default(); 34 35 let rt = Runtime::new().expect("failed to obtain a new RunTime object"); 36 let server_future = Server::builder() 37 .add_service(GreeterServer::new(greeter)) 38 .serve(addr); 39 rt.block_on(server_future) 40 .expect("failed to successfully run the future on RunTime"); 41 } 42