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 let reply = hello_world::HelloReply { 20 message: format!("Hello {}!", request.into_inner().name), 21 }; 22 Ok(Response::new(reply)) 23 } 24 } 25 26 #[tokio::main] 27 async fn main() -> Result<(), Box<dyn std::error::Error>> { 28 let addr = "[::1]:50051".parse().unwrap(); 29 let greeter = MyGreeter::default(); 30 31 let svc = GreeterServer::with_interceptor(greeter, intercept); 32 33 println!("GreeterServer listening on {}", addr); 34 35 Server::builder().add_service(svc).serve(addr).await?; 36 37 Ok(()) 38 } 39 40 /// This function will get called on each inbound request, if a `Status` 41 /// is returned, it will cancel the request and return that status to the 42 /// client. 43 fn intercept(req: Request<()>) -> Result<Request<()>, Status> { 44 println!("Intercepting request: {:?}", req); 45 Ok(req) 46 } 47