1 use tonic::transport::Server; 2 use tonic::{Request, Response, Status}; 3 4 mod proto { 5 tonic::include_proto!("helloworld"); 6 7 pub(crate) const FILE_DESCRIPTOR_SET: &[u8] = 8 tonic::include_file_descriptor_set!("helloworld_descriptor"); 9 } 10 11 #[derive(Default)] 12 pub struct MyGreeter {} 13 14 #[tonic::async_trait] 15 impl proto::greeter_server::Greeter for MyGreeter { 16 async fn say_hello( 17 &self, 18 request: Request<proto::HelloRequest>, 19 ) -> Result<Response<proto::HelloReply>, Status> { 20 println!("Got a request from {:?}", request.remote_addr()); 21 22 let reply = proto::HelloReply { 23 message: format!("Hello {}!", request.into_inner().name), 24 }; 25 Ok(Response::new(reply)) 26 } 27 } 28 29 #[tokio::main] 30 async fn main() -> Result<(), Box<dyn std::error::Error>> { 31 let service = tonic_reflection::server::Builder::configure() 32 .register_encoded_file_descriptor_set(proto::FILE_DESCRIPTOR_SET) 33 .build_v1() 34 .unwrap(); 35 36 let addr = "[::1]:50052".parse().unwrap(); 37 let greeter = MyGreeter::default(); 38 39 Server::builder() 40 .add_service(service) 41 .add_service(proto::greeter_server::GreeterServer::new(greeter)) 42 .serve(addr) 43 .await?; 44 45 Ok(()) 46 } 47