]> git.lizzy.rs Git - connect-rs.git/blob - src/tcp/server.rs
use generic futures-executor in place of async-task
[connect-rs.git] / src / tcp / server.rs
1 use crate::Connection;
2 use async_std::net::{SocketAddr, TcpListener, ToSocketAddrs};
3 use async_std::pin::Pin;
4 use futures::task::{Context, Poll};
5 use futures::{Stream, StreamExt};
6 use log::*;
7
8 #[allow(dead_code)]
9 pub struct TcpServer {
10     local_addrs: SocketAddr,
11     listener: TcpListener,
12 }
13
14 impl TcpServer {
15     pub fn new<A: ToSocketAddrs + std::fmt::Display>(ip_addrs: A) -> anyhow::Result<Self> {
16         let listener = futures::executor::block_on(TcpListener::bind(&ip_addrs))?;
17         info!("Started TCP server at {}", &ip_addrs);
18
19         Ok(Self {
20             local_addrs: listener.local_addr()?,
21             listener,
22         })
23     }
24 }
25
26 impl Stream for TcpServer {
27     type Item = Connection;
28
29     fn poll_next(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
30         if let Some(Ok(conn)) = futures::executor::block_on(self.listener.incoming().next()) {
31             debug!(
32                 "Received connection attempt from {}",
33                 conn.peer_addr()
34                     .expect("Peer address could not be retrieved")
35             );
36             Poll::Ready(Some(Connection::from(conn)))
37         } else {
38             info!("Shutting TCP server down at {}", self.local_addrs);
39             Poll::Ready(None)
40         }
41     }
42 }