use super::Listener; use async_trait::async_trait; use derive_more::From; use std::io; use tokio::sync::mpsc; /// Represents a [`Listener`] that uses an [`mpsc::Receiver`] to /// accept new connections #[derive(From)] pub struct MpscListener { inner: mpsc::Receiver, } impl MpscListener { pub fn channel(buffer: usize) -> (mpsc::Sender, Self) { let (tx, rx) = mpsc::channel(buffer); (tx, Self { inner: rx }) } } #[async_trait] impl Listener for MpscListener { type Output = T; async fn accept(&mut self) -> io::Result { self.inner .recv() .await .ok_or_else(|| io::Error::from(io::ErrorKind::BrokenPipe)) } }