1use std::future::Future;
2use std::pin::Pin;
3use tokio::signal;
4
5#[cfg(unix)]
6pub fn shutdown_signal() -> Pin<Box<dyn Future<Output = ()> + Send>> {
7 Box::pin(async move {
8 let ctrl_c = async {
9 signal::ctrl_c()
10 .await
11 .expect("failed to install Ctrl+C handler");
12 };
13
14 #[cfg(unix)]
15 let terminate = async {
16 signal::unix::signal(signal::unix::SignalKind::terminate())
17 .expect("failed to install signal handler")
18 .recv()
19 .await;
20 };
21
22 tokio::select! {
23 _ = ctrl_c => {},
24 _ = terminate => {},
25 }
26 })
27}
28
29#[cfg(not(unix))]
30pub fn shutdown_signal() -> Pin<Box<dyn Future<Output = ()> + Send>> {
31 Box::pin(async move {
32 signal::ctrl_c()
33 .await
34 .expect("failed to install Ctrl+C handler");
35 })
36}