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}