1 use crate::Stream; 2 use std::io; 3 use std::pin::Pin; 4 use std::task::{Context, Poll}; 5 use tokio::net::{TcpListener, TcpStream}; 6 7 /// A wrapper around [`TcpListener`] that implements [`Stream`]. 8 /// 9 /// [`TcpListener`]: struct@tokio::net::TcpListener 10 /// [`Stream`]: trait@crate::Stream 11 #[derive(Debug)] 12 #[cfg_attr(docsrs, doc(cfg(feature = "net")))] 13 pub struct TcpListenerStream { 14 inner: TcpListener, 15 } 16 17 impl TcpListenerStream { 18 /// Create a new `TcpListenerStream`. new(listener: TcpListener) -> Self19 pub fn new(listener: TcpListener) -> Self { 20 Self { inner: listener } 21 } 22 23 /// Get back the inner `TcpListener`. into_inner(self) -> TcpListener24 pub fn into_inner(self) -> TcpListener { 25 self.inner 26 } 27 } 28 29 impl Stream for TcpListenerStream { 30 type Item = io::Result<TcpStream>; 31 poll_next( self: Pin<&mut Self>, cx: &mut Context<'_>, ) -> Poll<Option<io::Result<TcpStream>>>32 fn poll_next( 33 self: Pin<&mut Self>, 34 cx: &mut Context<'_>, 35 ) -> Poll<Option<io::Result<TcpStream>>> { 36 match self.inner.poll_accept(cx) { 37 Poll::Ready(Ok((stream, _))) => Poll::Ready(Some(Ok(stream))), 38 Poll::Ready(Err(err)) => Poll::Ready(Some(Err(err))), 39 Poll::Pending => Poll::Pending, 40 } 41 } 42 } 43 44 impl AsRef<TcpListener> for TcpListenerStream { as_ref(&self) -> &TcpListener45 fn as_ref(&self) -> &TcpListener { 46 &self.inner 47 } 48 } 49 50 impl AsMut<TcpListener> for TcpListenerStream { as_mut(&mut self) -> &mut TcpListener51 fn as_mut(&mut self) -> &mut TcpListener { 52 &mut self.inner 53 } 54 } 55