use std::net::SocketAddr;
use crate::{TcpListener, TcpStream};
#[derive(Debug)]
pub struct Listener(TcpListener);
impl From<TcpListener> for Listener {
fn from(listener: TcpListener) -> Self {
Self(listener)
}
}
impl From<Listener> for TcpListener {
fn from(listener: Listener) -> Self {
listener.0
}
}
impl AsRef<TcpListener> for Listener {
fn as_ref(&self) -> &TcpListener {
&self.0
}
}
impl axum::serve::Listener for Listener {
type Io = TcpStream;
type Addr = SocketAddr;
async fn accept(&mut self) -> (Self::Io, Self::Addr) {
let stream = loop {
match self.0.accept().await {
Ok(stream) => break stream,
Err(e) => tracing::error!(err = %e, "tcp accept"),
}
};
let addr = stream.remote_addr();
(stream, addr)
}
fn local_addr(&self) -> std::io::Result<Self::Addr> {
Ok(self.0.local_addr())
}
}