#[cfg(unix)]
use std::task::Poll;
use futures::prelude::*;
use crate::router::Event;
#[derive(Clone, Default)]
pub(crate) struct ReloadSource;
impl ReloadSource {
pub(crate) fn into_stream(self) -> impl Stream<Item = Event> {
#[cfg(unix)]
let signal_stream = {
let mut signal = tokio::signal::unix::signal(tokio::signal::unix::SignalKind::hangup())
.expect("Failed to install SIGHUP signal handler");
futures::stream::poll_fn(move |cx| match signal.poll_recv(cx) {
Poll::Ready(Some(_)) => Poll::Ready(Some(Event::Reload)),
Poll::Ready(None) => Poll::Ready(None),
Poll::Pending => Poll::Pending,
})
.boxed()
};
#[cfg(not(unix))]
let signal_stream = futures::stream::empty().boxed();
signal_stream
}
}
pub(crate) trait ReloadableEventStream: Stream<Item = Event> + Sized {
fn with_sighup_reload(self) -> impl Stream<Item = Event> {
stream::select(self, ReloadSource.into_stream())
}
}
impl<S> ReloadableEventStream for S where S: Stream<Item = Event> {}