use std::io;
use tokio::net::tcp::{OwnedReadHalf, OwnedWriteHalf};
use tokio::net::{TcpListener, TcpStream, ToSocketAddrs};
use crate::traits::transport::Transport;
pub struct TcpTransport;
impl TcpTransport {
pub async fn connect(
addr: impl ToSocketAddrs,
) -> io::Result<(OwnedReadHalf, OwnedWriteHalf)> {
Ok(TcpStream::connect(addr).await?.into_split())
}
pub async fn bind(addr: impl ToSocketAddrs) -> io::Result<TcpListener> {
TcpListener::bind(addr).await
}
pub async fn accept(listener: &TcpListener) -> io::Result<(OwnedReadHalf, OwnedWriteHalf)> {
let (stream, _) = listener.accept().await?;
Ok(stream.into_split())
}
}
impl Transport for TcpTransport {
type Endpoint = str;
type Listener = TcpListener;
type Read = OwnedReadHalf;
type Write = OwnedWriteHalf;
async fn connect(endpoint: &str) -> io::Result<(OwnedReadHalf, OwnedWriteHalf)> {
TcpTransport::connect(endpoint).await
}
async fn bind(endpoint: &str) -> io::Result<TcpListener> {
TcpTransport::bind(endpoint).await
}
async fn accept(listener: &TcpListener) -> io::Result<(OwnedReadHalf, OwnedWriteHalf)> {
TcpTransport::accept(listener).await
}
}