use {
super::{LocalSocketStream, ToLocalSocketName},
std::{
fmt::{self, Debug, Formatter},
io,
iter::FusedIterator,
},
};
impmod! {local_socket,
LocalSocketListener as LocalSocketListenerImpl
}
pub struct LocalSocketListener {
inner: LocalSocketListenerImpl,
}
impl LocalSocketListener {
pub fn bind<'a>(name: impl ToLocalSocketName<'a>) -> io::Result<Self> {
Ok(Self {
inner: LocalSocketListenerImpl::bind(name)?,
})
}
pub fn accept(&self) -> io::Result<LocalSocketStream> {
Ok(LocalSocketStream {
inner: self.inner.accept()?,
})
}
pub fn incoming(&self) -> Incoming<'_> {
Incoming::from(self)
}
pub fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> {
self.inner.set_nonblocking(nonblocking)
}
}
impl Debug for LocalSocketListener {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
Debug::fmt(&self.inner, f)
}
}
#[derive(Debug)]
pub struct Incoming<'a> {
listener: &'a LocalSocketListener,
}
impl<'a> From<&'a LocalSocketListener> for Incoming<'a> {
fn from(listener: &'a LocalSocketListener) -> Self {
Self { listener }
}
}
impl Iterator for Incoming<'_> {
type Item = io::Result<LocalSocketStream>;
fn next(&mut self) -> Option<Self::Item> {
Some(self.listener.accept())
}
fn size_hint(&self) -> (usize, Option<usize>) {
(usize::MAX, None)
}
}
impl FusedIterator for Incoming<'_> {}