#![cfg_attr(not(unix), allow(unused_imports))] use std::path::Path; #[cfg(unix)] use tokio::net::UnixListener; #[cfg(unix)] use tokio_stream::wrappers::UnixListenerStream; #[cfg(unix)] use tonic::transport::server::UdsConnectInfo; 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(Default)] pub struct MyGreeter {} #[tonic::async_trait] impl Greeter for MyGreeter { async fn say_hello( &self, request: Request, ) -> Result, Status> { #[cfg(unix)] { let conn_info = request.extensions().get::().unwrap(); println!("Got a request {:?} with info {:?}", request, conn_info); } let reply = hello_world::HelloReply { message: format!("Hello {}!", request.into_inner().name), }; Ok(Response::new(reply)) } } #[cfg(unix)] #[tokio::main] async fn main() -> Result<(), Box> { let path = "/tmp/tonic/helloworld"; std::fs::create_dir_all(Path::new(path).parent().unwrap())?; let greeter = MyGreeter::default(); let uds = UnixListener::bind(path)?; let uds_stream = UnixListenerStream::new(uds); Server::builder() .add_service(GreeterServer::new(greeter)) .serve_with_incoming(uds_stream) .await?; Ok(()) } #[cfg(not(unix))] fn main() { panic!("The `uds` example only works on unix systems!"); }