• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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