#[cfg(unix)] pub struct Signals { sigint: tokio::signal::unix::Signal, sigterm: tokio::signal::unix::Signal, } #[cfg(not(unix))] pub struct Signals; #[cfg(unix)] impl Signals { pub fn new() -> Option { use tokio::signal::unix::{SignalKind, signal}; let sigint = signal(SignalKind::interrupt()).ok()?; let sigterm = signal(SignalKind::terminate()).ok()?; Some(Self { sigint, sigterm }) } pub async fn next(&mut self) -> &'static str { tokio::select! { _ = self.sigint.recv() => "SIGINT", _ = self.sigterm.recv() => "SIGTERM", } } } #[cfg(not(unix))] impl Signals { pub fn new() -> Option { Some(Self) } pub async fn next(&mut self) -> &'static str { let _ = tokio::signal::ctrl_c().await; "ctrl-c" } }