1 use tonic::{transport::Server, Request, Response, Status}; 2 3 pub mod hello_world { 4 tonic::include_proto!("helloworld"); 5 } 6 7 use hello_world::{ 8 greeter_server::{Greeter, GreeterServer}, 9 HelloReply, HelloRequest, 10 }; 11 12 #[derive(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 tracing::info!(message = "Inbound request.", metadata = ?request.metadata()); 22 23 let reply = hello_world::HelloReply { 24 message: format!("Hello {}!", request.into_inner().name), 25 }; 26 27 tracing::debug!(message = "Sending reply.", response = %reply.message); 28 29 Ok(Response::new(reply)) 30 } 31 } 32 33 #[tokio::main] 34 async fn main() -> Result<(), Box<dyn std::error::Error>> { 35 tracing_subscriber::FmtSubscriber::builder() 36 .with_max_level(tracing::Level::DEBUG) 37 .init(); 38 39 let addr = "[::1]:50051".parse().unwrap(); 40 let greeter = MyGreeter::default(); 41 42 tracing::info!(message = "Starting server.", %addr); 43 44 Server::builder() 45 .trace_fn(|_| tracing::info_span!("helloworld_server")) 46 .add_service(GreeterServer::new(greeter)) 47 .serve(addr) 48 .await?; 49 50 Ok(()) 51 } 52