local_socket/
server.rs

1use crate::SocketConnection;
2use crate::SocketError;
3use futures::stream::Stream;
4use std::{
5    path::PathBuf,
6    pin::Pin,
7    task::{Context, Poll},
8};
9use tokio::net::UnixListener;
10
11pub struct SocketServer {
12    listener: UnixListener,
13}
14
15impl SocketServer {
16    pub fn listen(path: PathBuf) -> Result<Self, std::io::Error> {
17        let listener = UnixListener::bind(path)?;
18        Ok(Self { listener })
19    }
20}
21
22impl Stream for SocketServer {
23    type Item = Result<SocketConnection, SocketError>;
24    fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
25        let server = self.get_mut();
26        match server.listener.poll_accept(cx) {
27            Poll::Ready(Ok((stream, _))) => {
28                let conn = SocketConnection::new(stream);
29                return Poll::Ready(Some(Ok(conn)));
30            }
31            Poll::Ready(Err(e)) => return Poll::Ready(Some(Err(SocketError::AcceptFailure(e)))),
32            Poll::Pending => {}
33        };
34        Poll::Pending
35    }
36}