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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
use std::net::SocketAddr; use rsocket_rust::async_trait; use rsocket_rust::{error::RSocketError, transport::Transport, Result}; use tokio::net::TcpStream; use crate::{connection::TcpConnection, misc::parse_tcp_addr}; #[derive(Debug)] enum Connector { Direct(TcpStream), Lazy(SocketAddr), } #[derive(Debug)] pub struct TcpClientTransport { connector: Connector, } #[async_trait] impl Transport for TcpClientTransport { type Conn = TcpConnection; async fn connect(self) -> Result<TcpConnection> { match self.connector { Connector::Direct(socket) => Ok(TcpConnection::from(socket)), Connector::Lazy(addr) => match TcpStream::connect(addr).await { Ok(stream) => Ok(TcpConnection::from(stream)), Err(e) => Err(RSocketError::IO(e).into()), }, } } } impl From<TcpStream> for TcpClientTransport { fn from(socket: TcpStream) -> TcpClientTransport { TcpClientTransport { connector: Connector::Direct(socket), } } } impl From<SocketAddr> for TcpClientTransport { fn from(addr: SocketAddr) -> TcpClientTransport { TcpClientTransport { connector: Connector::Lazy(addr), } } } impl From<String> for TcpClientTransport { fn from(addr: String) -> Self { let socket_addr: SocketAddr = parse_tcp_addr(addr) .parse() .expect("Invalid transport string!"); TcpClientTransport { connector: Connector::Lazy(socket_addr), } } } impl From<&str> for TcpClientTransport { fn from(addr: &str) -> TcpClientTransport { let socket_addr: SocketAddr = parse_tcp_addr(addr) .parse() .expect("Invalid transport string!"); TcpClientTransport { connector: Connector::Lazy(socket_addr), } } }