use tonic::{transport::Server, Request, Response, Status}; pub mod hello_world { tonic::include_proto!("helloworld"); } use hello_world::{ greeter_server::{Greeter, GreeterServer}, HelloReply, HelloRequest, }; #[derive(Debug, Default)] pub struct MyGreeter {} #[tonic::async_trait] impl Greeter for MyGreeter { #[tracing::instrument] async fn say_hello( &self, request: Request, ) -> Result, Status> { tracing::info!("received request"); let reply = hello_world::HelloReply { message: format!("Hello {}!", request.into_inner().name), }; tracing::debug!("sending response"); Ok(Response::new(reply)) } } #[tokio::main] async fn main() -> Result<(), Box> { tracing_subscriber::fmt() .with_max_level(tracing::Level::DEBUG) .init(); let addr = "[::1]:50051".parse().unwrap(); let greeter = MyGreeter::default(); tracing::info!(message = "Starting server.", %addr); Server::builder() .trace_fn(|_| tracing::info_span!("helloworld_server")) .add_service(GreeterServer::new(greeter)) .serve(addr) .await?; Ok(()) }