use crate::err::Error; #[cfg(unix)] pub async fn listen() -> Result { // Import the OS signals use tokio::signal::unix::{signal, SignalKind}; // Get the operating system signal types let mut sighup = signal(SignalKind::hangup())?; let mut sigint = signal(SignalKind::interrupt())?; let mut sigquit = signal(SignalKind::quit())?; let mut sigterm = signal(SignalKind::terminate())?; // Listen and wait for the system signals tokio::select! { // Wait for a SIGQUIT signal _ = sighup.recv() => { Ok(String::from("SIGHUP")) } // Wait for a SIGINT signal _ = sigint.recv() => { Ok(String::from("SIGINT")) } // Wait for a SIGQUIT signal _ = sigquit.recv() => { Ok(String::from("SIGQUIT")) } // Wait for a SIGTERM signal _ = sigterm.recv() => { Ok(String::from("SIGTERM")) } } } #[cfg(windows)] pub async fn listen() -> Result { // Import the OS signals use tokio::signal::windows; // Get the operating system signal types let mut exit = windows::ctrl_c()?; let mut leave = windows::ctrl_break()?; let mut close = windows::ctrl_close()?; let mut shutdown = windows::ctrl_shutdown()?; // Listen and wait for the system signals tokio::select! { // Wait for a CTRL-C signal _ = exit.recv() => { Ok(String::from("CTRL-C")) } // Wait for a CTRL-BREAK signal _ = leave.recv() => { Ok(String::from("CTRL-BREAK")) } // Wait for a CTRL-CLOSE signal _ = close.recv() => { Ok(String::from("CTRL-CLOSE")) } // Wait for a CTRL-SHUTDOWN signal _ = shutdown.recv() => { Ok(String::from("CTRL-SHUTDOWN")) } } }