use std::error::Error as StdError; use std::pin::Pin; use std::task; use futures::io; use futures::Stream; pub mod addr; pub trait Accept { type Conn: io::AsyncRead + io::AsyncWrite; type Error: StdError; fn poll_accept( self: Pin<&mut Self>, cx: &mut task::Context, ) -> task::Poll>>; } pub fn poll_fn(f: F) -> impl Accept where F: FnMut(&mut task::Context) -> task::Poll>>, IO: io::AsyncRead + io::AsyncWrite, E: StdError, { struct PollFn(F); impl Unpin for PollFn {} impl Accept for PollFn where F: FnMut(&mut task::Context) -> task::Poll>>, IO: io::AsyncRead + io::AsyncWrite, E: StdError, { type Conn = IO; type Error = E; fn poll_accept( self: Pin<&mut Self>, cx: &mut task::Context, ) -> task::Poll>> { (self.get_mut().0)(cx) } } PollFn(f) } pub fn from_stream(stream: S) -> impl Accept where S: Stream>, IO: io::AsyncRead + io::AsyncWrite, E: StdError, { use pin_project::pin_project; #[pin_project] struct FromStream(#[pin] S); impl Accept for FromStream where S: Stream>, IO: io::AsyncRead + io::AsyncWrite, E: StdError, { type Conn = IO; type Error = E; fn poll_accept( self: Pin<&mut Self>, cx: &mut task::Context, ) -> task::Poll>> { self.project().0.poll_next(cx) } } FromStream(stream) }