use crate::net::Shutdown;
use crate::os::unix::net::SocketAddr;
use async_std::io::{self, IoSlice, IoSliceMut, Read, Write};
use async_std::os::unix;
use async_std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd};
use async_std::task::{Context, Poll};
use io_lifetimes::{AsFd, BorrowedFd, FromFd, IntoFd, OwnedFd};
use std::fmt;
use std::pin::Pin;
#[derive(Clone)]
pub struct UnixStream {
std: unix::net::UnixStream,
}
impl UnixStream {
#[inline]
pub fn from_std(std: unix::net::UnixStream) -> Self {
Self { std }
}
#[inline]
pub fn pair() -> io::Result<(Self, Self)> {
unix::net::UnixStream::pair().map(|(a, b)| (Self::from_std(a), Self::from_std(b)))
}
#[inline]
pub fn local_addr(&self) -> io::Result<SocketAddr> {
self.std.local_addr()
}
#[inline]
pub fn peer_addr(&self) -> io::Result<SocketAddr> {
self.std.peer_addr()
}
#[inline]
pub fn shutdown(&self, how: Shutdown) -> io::Result<()> {
self.std.shutdown(how)
}
}
impl FromRawFd for UnixStream {
#[inline]
unsafe fn from_raw_fd(fd: RawFd) -> Self {
Self::from_std(unix::net::UnixStream::from_raw_fd(fd))
}
}
impl FromFd for UnixStream {
#[inline]
fn from_fd(fd: OwnedFd) -> Self {
Self::from_std(unix::net::UnixStream::from_fd(fd))
}
}
impl AsRawFd for UnixStream {
#[inline]
fn as_raw_fd(&self) -> RawFd {
self.std.as_raw_fd()
}
}
impl AsFd for UnixStream {
#[inline]
fn as_fd(&self) -> BorrowedFd<'_> {
self.std.as_fd()
}
}
impl IntoRawFd for UnixStream {
#[inline]
fn into_raw_fd(self) -> RawFd {
self.std.into_raw_fd()
}
}
impl IntoFd for UnixStream {
#[inline]
fn into_fd(self) -> OwnedFd {
self.std.into_fd()
}
}
impl Read for UnixStream {
#[inline]
fn poll_read(
mut self: Pin<&mut Self>,
cx: &mut Context,
buf: &mut [u8],
) -> Poll<io::Result<usize>> {
Read::poll_read(Pin::new(&mut self.std), cx, buf)
}
#[inline]
fn poll_read_vectored(
mut self: Pin<&mut Self>,
cx: &mut Context,
bufs: &mut [IoSliceMut],
) -> Poll<io::Result<usize>> {
Read::poll_read_vectored(Pin::new(&mut self.std), cx, bufs)
}
}
impl Read for &UnixStream {
#[inline]
fn poll_read(
self: Pin<&mut Self>,
cx: &mut Context,
buf: &mut [u8],
) -> Poll<io::Result<usize>> {
Read::poll_read(Pin::new(&mut &self.std), cx, buf)
}
#[inline]
fn poll_read_vectored(
self: Pin<&mut Self>,
cx: &mut Context,
bufs: &mut [IoSliceMut],
) -> Poll<io::Result<usize>> {
Read::poll_read_vectored(Pin::new(&mut &self.std), cx, bufs)
}
}
impl Write for UnixStream {
#[inline]
fn poll_write(
mut self: Pin<&mut Self>,
cx: &mut Context,
buf: &[u8],
) -> Poll<io::Result<usize>> {
Write::poll_write(Pin::new(&mut self.std), cx, buf)
}
#[inline]
fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll<io::Result<()>> {
Write::poll_flush(Pin::new(&mut self.std), cx)
}
#[inline]
fn poll_close(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll<io::Result<()>> {
Write::poll_close(Pin::new(&mut self.std), cx)
}
#[inline]
fn poll_write_vectored(
mut self: Pin<&mut Self>,
cx: &mut Context,
bufs: &[IoSlice],
) -> Poll<io::Result<usize>> {
Write::poll_write_vectored(Pin::new(&mut self.std), cx, bufs)
}
}
impl Write for &UnixStream {
#[inline]
fn poll_write(self: Pin<&mut Self>, cx: &mut Context, buf: &[u8]) -> Poll<io::Result<usize>> {
Write::poll_write(Pin::new(&mut &self.std), cx, buf)
}
#[inline]
fn poll_flush(self: Pin<&mut Self>, cx: &mut Context) -> Poll<io::Result<()>> {
Write::poll_flush(Pin::new(&mut &self.std), cx)
}
#[inline]
fn poll_close(self: Pin<&mut Self>, cx: &mut Context) -> Poll<io::Result<()>> {
Write::poll_close(Pin::new(&mut &self.std), cx)
}
#[inline]
fn poll_write_vectored(
self: Pin<&mut Self>,
cx: &mut Context,
bufs: &[IoSlice],
) -> Poll<io::Result<usize>> {
Write::poll_write_vectored(Pin::new(&mut &self.std), cx, bufs)
}
}
impl fmt::Debug for UnixStream {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.std.fmt(f)
}
}