use std::{future::Future, io, net::SocketAddr};
#[cfg(unix)]
use tokio::net::UnixListener;
use tokio::{
io::{AsyncRead, AsyncWrite},
net::TcpListener,
};
pub trait Listener: Send + 'static {
type Io: AsyncRead + AsyncWrite + Unpin + Send + 'static;
fn accept(&mut self)
-> impl Future<Output = io::Result<(Self::Io, Option<SocketAddr>)>> + Send;
fn tcp_addr(&self) -> Option<SocketAddr> {
None
}
}
impl Listener for TcpListener {
type Io = tokio::net::TcpStream;
async fn accept(&mut self) -> io::Result<(Self::Io, Option<SocketAddr>)> {
let (stream, addr) = TcpListener::accept(self).await?;
Ok((stream, Some(addr)))
}
fn tcp_addr(&self) -> Option<SocketAddr> {
TcpListener::local_addr(self).ok()
}
}
#[cfg(unix)]
impl Listener for UnixListener {
type Io = tokio::net::UnixStream;
async fn accept(&mut self) -> io::Result<(Self::Io, Option<SocketAddr>)> {
let (stream, _addr) = UnixListener::accept(self).await?;
Ok((stream, None))
}
}