#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Signal {
Hangup,
Terminate,
}
impl Signal {
#[must_use]
pub const fn exit_code(self) -> i32 {
match self {
Self::Hangup => 129,
Self::Terminate => 143,
}
}
}
#[cfg(unix)]
pub async fn next() -> Signal {
use tokio::signal::unix::{SignalKind, signal};
let (Ok(mut hangup), Ok(mut terminate)) = (
signal(SignalKind::hangup()),
signal(SignalKind::terminate()),
) else {
return std::future::pending().await;
};
tokio::select! {
_ = hangup.recv() => Signal::Hangup,
_ = terminate.recv() => Signal::Terminate,
}
}
#[cfg(windows)]
pub async fn next() -> Signal {
match tokio::signal::windows::ctrl_break() {
Ok(mut ctrl_break) => {
ctrl_break.recv().await;
Signal::Terminate
}
Err(_) => std::future::pending().await,
}
}