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 pub mod hello_world { 7 tonic::include_proto!("helloworld"); 8 } 9 10 #[derive(Default)] 11 pub struct MyGreeter {} 12 13 #[tonic::async_trait] 14 impl Greeter for MyGreeter { 15 async fn say_hello( 16 &self, 17 request: Request<HelloRequest>, 18 ) -> Result<Response<HelloReply>, Status> { 19 println!("Got a request from {:?}", request.remote_addr()); 20 21 let reply = hello_world::HelloReply { 22 message: format!("Hello {}!", request.into_inner().name), 23 }; 24 Ok(Response::new(reply)) 25 } 26 } 27 28 #[tokio::main] 29 async fn main() -> Result<(), Box<dyn std::error::Error>> { 30 let addr = "[::1]:50051".parse().unwrap(); 31 let greeter = MyGreeter::default(); 32 33 println!("GreeterServer listening on {}", addr); 34 35 let server = Server::builder().add_service(GreeterServer::new(greeter)); 36 37 match listenfd::ListenFd::from_env().take_tcp_listener(0)? { 38 Some(listener) => { 39 let listener = tokio_stream::wrappers::TcpListenerStream::new( 40 tokio::net::TcpListener::from_std(listener)?, 41 ); 42 43 server.serve_with_incoming(listener).await?; 44 } 45 None => { 46 server.serve(addr).await?; 47 } 48 } 49 50 Ok(()) 51 } 52