#![cfg_attr(not(unix), allow(unused_imports))] pub mod hello_world { tonic::include_proto!("helloworld"); } use hello_world::{greeter_client::GreeterClient, HelloRequest}; use hyper_util::rt::TokioIo; #[cfg(unix)] use tokio::net::UnixStream; use tonic::transport::{Endpoint, Uri}; use tower::service_fn; #[cfg(unix)] #[tokio::main] async fn main() -> Result<(), Box> { // We will ignore this uri because uds do not use it // if your connector does use the uri it will be provided // as the request to the `MakeConnection`. let channel = Endpoint::try_from("http://[::]:50051")? .connect_with_connector(service_fn(|_: Uri| async { let path = "/tmp/tonic/helloworld"; // Connect to a Uds socket Ok::<_, std::io::Error>(TokioIo::new(UnixStream::connect(path).await?)) })) .await?; let mut client = GreeterClient::new(channel); let request = tonic::Request::new(HelloRequest { name: "Tonic".into(), }); let response = client.say_hello(request).await?; println!("RESPONSE={:?}", response); Ok(()) } #[cfg(not(unix))] fn main() { panic!("The `uds` example only works on unix systems!"); }