use core::net::SocketAddr;
use std::io;
use super::Stream;
pub use tokio::net::TcpListener;
#[cfg(not(target_family = "wasm"))]
pub use tokio::net::TcpSocket;
pub struct TcpStream(pub(crate) tokio::net::TcpStream);
impl TcpStream {
#[cfg(not(target_family = "wasm"))]
pub async fn connect<A: tokio::net::ToSocketAddrs>(addr: A) -> io::Result<Self> {
tokio::net::TcpStream::connect(addr).await.map(Self)
}
pub fn from_std(stream: std::net::TcpStream) -> io::Result<Self> {
tokio::net::TcpStream::from_std(stream).map(Self)
}
pub fn into_std(self) -> io::Result<std::net::TcpStream> {
self.0.into_std()
}
pub fn set_nodelay(&self, nodelay: bool) -> io::Result<()> {
self.0.set_nodelay(nodelay)
}
}
impl From<tokio::net::TcpStream> for TcpStream {
fn from(stream: tokio::net::TcpStream) -> Self {
Self(stream)
}
}
impl TryFrom<Stream> for TcpStream {
type Error = io::Error;
fn try_from(stream: Stream) -> Result<Self, Self::Error> {
<(TcpStream, SocketAddr)>::try_from(stream).map(|(tcp, _)| tcp)
}
}
impl TryFrom<Stream> for (TcpStream, SocketAddr) {
type Error = io::Error;
fn try_from(stream: Stream) -> Result<Self, Self::Error> {
match stream {
Stream::Tcp(tcp, addr) => TcpStream::from_std(tcp).map(|tcp| (tcp, addr)),
#[allow(unreachable_patterns)]
_ => unreachable!("Can not be casted to TcpStream"),
}
}
}
super::default_aio_impl!(TcpStream);
#[cfg(unix)]
mod unix_impl {
use std::os::unix::io::{AsFd, BorrowedFd};
use super::TcpStream;
impl AsFd for TcpStream {
fn as_fd(&self) -> BorrowedFd<'_> {
self.0.as_fd()
}
}
}
#[cfg(windows)]
mod windows_impl {
use std::os::windows::io::{AsSocket, BorrowedSocket};
use super::TcpStream;
impl AsSocket for TcpStream {
fn as_socket(&self) -> BorrowedSocket<'_> {
self.0.as_socket()
}
}
}