cancelation/
cancelation.rs

1use coachman as cm;
2use coachman::{try_await, Canceled, Completed, TaskError};
3
4async fn inner_func(i: usize, duration: u64) {
5    match try_await!(tokio::time::sleep(std::time::Duration::from_secs(duration))) {
6        Canceled => println!("task#{} inner canceled", i),
7        Completed(_) => println!("task#{} inner completed", i),
8    }
9}
10
11async fn outer_func(i: usize, duration: u64) {
12    match try_await!(inner_func(i, duration)) {
13        Canceled => println!("task#{} outer canceled", i),
14        Completed(_) => println!("task#{} outer completed", i),
15    }
16}
17
18#[tokio::main(flavor = "current_thread")]
19async fn main() {
20    let mut task_handles = Vec::new();
21    for i in 0..5 {
22        let duration = i as u64;
23        task_handles.push(cm::spawn(outer_func(i, duration)));
24    }
25
26    let deadline = tokio::time::Instant::now() + std::time::Duration::from_secs(2);
27    for (i, mut handle) in task_handles.into_iter().enumerate() {
28        if tokio::time::timeout_at(deadline, &mut handle).await.is_ok() {
29            println!("task-{} completed", i);
30        } else {
31            handle.cancel();
32            match handle.await {
33                Result::Err(TaskError::Canceled) => println!("task-{} canceled", i),
34                Result::Err(TaskError::Aborted) => println!("task-{} aborted", i),
35                Result::Err(TaskError::Panicked(_)) => println!("task-{} panicked", i),
36                Result::Ok(_) => unreachable!(),
37            }
38        }
39    }
40}