use std::io::{self, Read, Write};
use std::net::{Shutdown, SocketAddr, TcpStream};
use std::time::Duration;
pub trait NetStream: Read + Write + Send {
fn set_read_timeout(&self, dur: Option<Duration>) -> io::Result<()>;
fn set_write_timeout(&self, dur: Option<Duration>) -> io::Result<()>;
fn peer_addr(&self) -> io::Result<SocketAddr>;
fn local_addr(&self) -> io::Result<SocketAddr>;
fn shutdown(&self, how: Shutdown) -> io::Result<()>;
fn try_clone_box(&self) -> io::Result<Box<dyn NetStream>>;
}
impl NetStream for TcpStream {
fn set_read_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
TcpStream::set_read_timeout(self, dur)
}
fn set_write_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
TcpStream::set_write_timeout(self, dur)
}
fn peer_addr(&self) -> io::Result<SocketAddr> {
TcpStream::peer_addr(self)
}
fn local_addr(&self) -> io::Result<SocketAddr> {
TcpStream::local_addr(self)
}
fn shutdown(&self, how: Shutdown) -> io::Result<()> {
TcpStream::shutdown(self, how)
}
fn try_clone_box(&self) -> io::Result<Box<dyn NetStream>> {
Ok(Box::new(TcpStream::try_clone(self)?))
}
}
#[cfg(unix)]
impl NetStream for std::os::unix::net::UnixStream {
fn set_read_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
std::os::unix::net::UnixStream::set_read_timeout(self, dur)
}
fn set_write_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
std::os::unix::net::UnixStream::set_write_timeout(self, dur)
}
fn peer_addr(&self) -> io::Result<SocketAddr> {
Err(io::Error::new(
io::ErrorKind::Unsupported,
"peer_addr unavailable on a Unix-domain socket",
))
}
fn local_addr(&self) -> io::Result<SocketAddr> {
Err(io::Error::new(
io::ErrorKind::Unsupported,
"local_addr unavailable on a Unix-domain socket",
))
}
fn shutdown(&self, how: Shutdown) -> io::Result<()> {
std::os::unix::net::UnixStream::shutdown(self, how)
}
fn try_clone_box(&self) -> io::Result<Box<dyn NetStream>> {
Ok(Box::new(std::os::unix::net::UnixStream::try_clone(self)?))
}
}