use crate::net::{Shutdown, SocketAddr};
#[cfg(unix)]
use async_std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd};
#[cfg(windows)]
use async_std::os::windows::io::{AsRawSocket, FromRawSocket, IntoRawSocket, RawSocket};
use async_std::{
io, net,
task::{Context, Poll},
};
use std::pin::Pin;
pub struct TcpStream {
std: net::TcpStream,
}
impl TcpStream {
#[inline]
pub fn from_std(std: net::TcpStream) -> Self {
Self { std }
}
#[inline]
pub fn local_addr(&self) -> io::Result<SocketAddr> {
self.std.local_addr()
}
#[inline]
pub fn shutdown(&self, how: Shutdown) -> io::Result<()> {
self.std.shutdown(how)
}
#[inline]
pub async fn peek(&self, buf: &mut [u8]) -> io::Result<usize> {
self.std.peek(buf).await
}
#[inline]
pub fn set_nodelay(&self, nodelay: bool) -> io::Result<()> {
self.std.set_nodelay(nodelay)
}
#[inline]
pub fn nodelay(&self) -> io::Result<bool> {
self.std.nodelay()
}
#[inline]
pub fn set_ttl(&self, ttl: u32) -> io::Result<()> {
self.std.set_ttl(ttl)
}
#[inline]
pub fn ttl(&self) -> io::Result<u32> {
self.std.ttl()
}
}
#[cfg(unix)]
impl FromRawFd for TcpStream {
#[inline]
unsafe fn from_raw_fd(fd: RawFd) -> Self {
Self::from_std(net::TcpStream::from_raw_fd(fd))
}
}
#[cfg(windows)]
impl FromRawSocket for TcpStream {
#[inline]
unsafe fn from_raw_socket(socket: RawSocket) -> Self {
Self::from_std(net::TcpStream::from_raw_socket(socket))
}
}
#[cfg(unix)]
impl AsRawFd for TcpStream {
#[inline]
fn as_raw_fd(&self) -> RawFd {
self.std.as_raw_fd()
}
}
#[cfg(windows)]
impl AsRawSocket for TcpStream {
#[inline]
fn as_raw_socket(&self) -> RawSocket {
self.std.as_raw_socket()
}
}
#[cfg(unix)]
impl IntoRawFd for TcpStream {
#[inline]
fn into_raw_fd(self) -> RawFd {
self.std.into_raw_fd()
}
}
#[cfg(windows)]
impl IntoRawSocket for TcpStream {
#[inline]
fn into_raw_socket(self) -> RawSocket {
self.std.into_raw_socket()
}
}
impl io::Read for TcpStream {
#[inline]
fn poll_read(
mut self: Pin<&mut Self>,
cx: &mut Context,
buf: &mut [u8],
) -> Poll<io::Result<usize>> {
io::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 [io::IoSliceMut],
) -> Poll<io::Result<usize>> {
io::Read::poll_read_vectored(Pin::new(&mut self.std), cx, bufs)
}
}
impl io::Write for TcpStream {
#[inline]
fn poll_write(
mut self: Pin<&mut Self>,
cx: &mut Context,
buf: &[u8],
) -> Poll<io::Result<usize>> {
io::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<()>> {
io::Write::poll_flush(Pin::new(&mut self.std), cx)
}
#[inline]
fn poll_close(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll<io::Result<()>> {
io::Write::poll_close(Pin::new(&mut self.std), cx)
}
#[inline]
fn poll_write_vectored(
mut self: Pin<&mut Self>,
cx: &mut Context,
bufs: &[io::IoSlice],
) -> Poll<io::Result<usize>> {
io::Write::poll_write_vectored(Pin::new(&mut self.std), cx, bufs)
}
}