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)),
}
}
}