#[cfg(feature = "runtime-uring")]
pub mod io_uring;
#[cfg(feature = "quic")]
mod quic;
mod tcp;
#[cfg(unix)]
mod unix;
#[cfg(feature = "quic")]
pub use quic::*;
#[cfg(not(target_family = "wasm"))]
pub use tcp::TcpSocket;
pub use tcp::{TcpListener, TcpStream};
#[cfg(unix)]
pub use unix::{UnixListener, UnixStream};
use core::net::SocketAddr;
macro_rules! default_aio_impl {
($ty: ty) => {
impl crate::io::AsyncBufRead for $ty {
fn read<B>(&self, buf: B) -> impl core::future::Future<Output = (::std::io::Result<usize>, B)>
where
B: crate::io::BoundedBufMut,
{
crate::io::AsyncBufRead::read(&self.0, buf)
}
}
impl crate::io::AsyncBufWrite for $ty {
fn write<B>(&self, buf: B) -> impl core::future::Future<Output = (::std::io::Result<usize>, B)>
where
B: crate::io::BoundedBuf,
{
crate::io::AsyncBufWrite::write(&self.0, buf)
}
fn shutdown(
self,
direction: ::std::net::Shutdown,
) -> impl core::future::Future<Output = ::std::io::Result<()>> {
crate::io::AsyncBufWrite::shutdown(self.0, direction)
}
}
impl crate::io::AsyncIo for $ty {
#[inline]
async fn ready(&mut self, interest: crate::io::Interest) -> ::std::io::Result<crate::io::Ready> {
self.0.ready(interest).await
}
fn poll_ready(
&mut self,
interest: crate::io::Interest,
cx: &mut ::core::task::Context<'_>,
) -> ::core::task::Poll<::std::io::Result<crate::io::Ready>> {
match interest {
crate::io::Interest::READABLE => self.0.poll_read_ready(cx).map_ok(|_| crate::io::Ready::READABLE),
crate::io::Interest::WRITABLE => self.0.poll_write_ready(cx).map_ok(|_| crate::io::Ready::WRITABLE),
_ => unimplemented!("tokio does not support poll_ready for BOTH read and write ready"),
}
}
fn is_vectored_write(&self) -> bool {
crate::io::AsyncWrite::is_write_vectored(&self.0)
}
fn poll_shutdown(
self: ::core::pin::Pin<&mut Self>,
cx: &mut ::core::task::Context<'_>,
) -> ::core::task::Poll<::std::io::Result<()>> {
crate::io::AsyncWrite::poll_shutdown(::core::pin::Pin::new(&mut self.get_mut().0), cx)
}
}
impl ::std::io::Read for $ty {
#[inline]
fn read(&mut self, buf: &mut [u8]) -> ::std::io::Result<usize> {
self.0.try_read(buf)
}
}
impl ::std::io::Write for $ty {
#[inline]
fn write(&mut self, buf: &[u8]) -> ::std::io::Result<usize> {
self.0.try_write(buf)
}
#[inline]
fn write_vectored(&mut self, bufs: &[::std::io::IoSlice<'_>]) -> ::std::io::Result<usize> {
self.0.try_write_vectored(bufs)
}
#[inline]
fn flush(&mut self) -> ::std::io::Result<()> {
Ok(())
}
}
impl ::std::io::Read for &$ty {
#[inline]
fn read(&mut self, buf: &mut [u8]) -> ::std::io::Result<usize> {
self.0.try_read(buf)
}
}
impl ::std::io::Write for &$ty {
#[inline]
fn write(&mut self, buf: &[u8]) -> ::std::io::Result<usize> {
self.0.try_write(buf)
}
#[inline]
fn write_vectored(&mut self, bufs: &[::std::io::IoSlice<'_>]) -> ::std::io::Result<usize> {
self.0.try_write_vectored(bufs)
}
#[inline]
fn flush(&mut self) -> ::std::io::Result<()> {
Ok(())
}
}
};
}
use default_aio_impl;
#[allow(clippy::large_enum_variant)]
pub enum Stream {
Tcp(std::net::TcpStream, SocketAddr),
#[cfg(feature = "quic")]
Udp(QuicStream, SocketAddr),
#[cfg(unix)]
Unix(std::os::unix::net::UnixStream, std::os::unix::net::SocketAddr),
}