pub use tokio_util::sync::CancellationToken;
#[must_use]
pub fn on_ctrl_c() -> CancellationToken {
let token = CancellationToken::new();
let child = token.clone();
tokio::spawn(async move {
if tokio::signal::ctrl_c().await.is_ok() {
child.cancel();
}
});
token
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn cancellation_propagates_to_clones() {
let token = CancellationToken::new();
let clone = token.clone();
assert!(!token.is_cancelled());
assert!(!clone.is_cancelled());
token.cancel();
assert!(token.is_cancelled());
assert!(clone.is_cancelled());
}
#[tokio::test]
async fn on_ctrl_c_returns_a_live_uncancelled_token() {
let token = on_ctrl_c();
assert!(!token.is_cancelled());
token.cancel();
token.cancelled().await;
assert!(token.is_cancelled());
}
}