use std::time::Duration;
use tokio_task_supervisor::{CancelOutcome, TaskSupervisor};
#[tokio::main(flavor = "current_thread")]
async fn main() {
let supervisor = TaskSupervisor::new();
let background = supervisor.spawn_with_cancel(|| async {
println!("job: starting slow work");
tokio::time::sleep(Duration::from_secs(5)).await;
println!("job: finished slow work");
"all done"
});
let _ = supervisor.spawn_with_token(move |_token| async move {
tokio::time::sleep(Duration::from_secs(1)).await;
println!("canceller: requesting shutdown");
match background.await.expect("spawn failed") {
CancelOutcome::Completed(msg) => println!("job completed: {msg}"),
CancelOutcome::Cancelled => println!("job cancelled before completion"),
}
});
println!("main: shutting down");
supervisor.shutdown().await;
println!("main: shutdown finished");
}