#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum Signal {
Term,
Kill,
Int,
Hup,
Quit,
Usr1,
Usr2,
Other(i32),
}
#[cfg(unix)]
impl Signal {
pub(crate) fn raw(self) -> i32 {
match self {
Signal::Term => libc::SIGTERM,
Signal::Kill => libc::SIGKILL,
Signal::Int => libc::SIGINT,
Signal::Hup => libc::SIGHUP,
Signal::Quit => libc::SIGQUIT,
Signal::Usr1 => libc::SIGUSR1,
Signal::Usr2 => libc::SIGUSR2,
Signal::Other(n) => n,
}
}
}
#[cfg(test)]
mod tests {
use super::Signal;
#[cfg(unix)]
#[test]
fn raw_maps_curated_variants_and_passes_other_through() {
assert_eq!(Signal::Term.raw(), libc::SIGTERM);
assert_eq!(Signal::Kill.raw(), libc::SIGKILL);
assert_eq!(Signal::Int.raw(), libc::SIGINT);
assert_eq!(Signal::Hup.raw(), libc::SIGHUP);
assert_eq!(Signal::Quit.raw(), libc::SIGQUIT);
assert_eq!(Signal::Usr1.raw(), libc::SIGUSR1);
assert_eq!(Signal::Usr2.raw(), libc::SIGUSR2);
assert_eq!(Signal::Other(64).raw(), 64);
}
#[test]
fn signal_is_copy_eq_and_hashable() {
let sig = Signal::Hup;
let copy = sig; assert_eq!(sig, copy);
assert_ne!(Signal::Other(1), Signal::Other(2));
let mut set = std::collections::HashSet::new();
set.insert(Signal::Term);
set.insert(Signal::Term);
assert_eq!(set.len(), 1);
}
}