1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
use rsocket_rust::async_trait; use rsocket_rust::{error::RSocketError, transport::Transport, Result}; use tokio::net::UnixStream; use crate::connection::UnixConnection; use crate::misc::parse_uds_addr; #[derive(Debug)] enum Connector { Direct(UnixStream), Lazy(String), } #[derive(Debug)] pub struct UnixClientTransport { connector: Connector, } #[async_trait] impl Transport for UnixClientTransport { type Conn = UnixConnection; async fn connect(self) -> Result<UnixConnection> { match self.connector { Connector::Direct(socket) => Ok(UnixConnection::from(socket)), Connector::Lazy(addr) => match UnixStream::connect(addr).await { Ok(stream) => Ok(UnixConnection::from(stream)), Err(e) => Err(RSocketError::IO(e).into()), }, } } } impl From<UnixStream> for UnixClientTransport { fn from(socket: UnixStream) -> UnixClientTransport { UnixClientTransport { connector: Connector::Direct(socket), } } } impl From<String> for UnixClientTransport { fn from(addr: String) -> UnixClientTransport { UnixClientTransport { connector: Connector::Lazy(parse_uds_addr(addr)), } } } impl From<&str> for UnixClientTransport { fn from(addr: &str) -> UnixClientTransport { UnixClientTransport { connector: Connector::Lazy(parse_uds_addr(addr)), } } }