#![deny(missing_docs)]
use futures_util::stream::Stream;
use std::error::Error;
use std::{boxed::Box, pin::Pin};
use tokio::io::{AsyncRead, AsyncWrite};
pub trait IntoIncoming<S, C, E>
where
S: Stream<Item = Result<C, E>> + Send + 'static,
C: AsyncRead + AsyncWrite + Unpin + Send,
E: Into<Box<dyn Error + Sync + Send + 'static>> + std::fmt::Debug + Unpin + Send,
{
fn into_incoming(self) -> S;
}
impl
IntoIncoming<
Pin<Box<dyn Stream<Item = Result<tokio::net::TcpStream, tokio::io::Error>> + Send>>,
tokio::net::TcpStream,
tokio::io::Error,
> for tokio::net::TcpListener
{
fn into_incoming(
mut self,
) -> Pin<Box<dyn Stream<Item = Result<tokio::net::TcpStream, tokio::io::Error>> + Send>> {
Box::pin(futures_util::stream::poll_fn(move |cx| {
self.poll_accept(cx).map(|st| Some(st.map(|(st, _)| st)))
}))
}
}
impl
IntoIncoming<
Pin<Box<dyn Stream<Item = Result<tokio::net::UnixStream, tokio::io::Error>> + Send>>,
tokio::net::UnixStream,
tokio::io::Error,
> for tokio::net::UnixListener
{
fn into_incoming(
mut self,
) -> Pin<Box<dyn Stream<Item = Result<tokio::net::UnixStream, tokio::io::Error>> + Send>> {
Box::pin(futures_util::stream::poll_fn(move |cx| {
let mut inc = self.incoming();
Pin::new(&mut inc).poll_accept(cx).map(|st| Some(st))
}))
}
}