Skip to main content

advance_task/
advance_task.rs

1use async_trait::async_trait;
2use minitimer::{TaskBuilder, TaskRunner};
3use std::sync::Arc;
4use std::sync::atomic::{AtomicU64, Ordering};
5use std::time::Duration;
6
7struct CounterTask {
8    id: u64,
9    counter: Arc<AtomicU64>,
10}
11
12#[async_trait]
13impl TaskRunner for CounterTask {
14    type Output = ();
15
16    async fn run(&self) -> Result<Self::Output, Box<dyn std::error::Error + Send + Sync>> {
17        let count = self.counter.fetch_add(1, Ordering::SeqCst) + 1;
18        println!("Task {} executed! (count: {})", self.id, count);
19        Ok(())
20    }
21}
22
23#[tokio::main]
24async fn main() {
25    let counter = Arc::new(AtomicU64::new(0));
26    let timer = minitimer::MiniTimer::new();
27
28    let task = TaskBuilder::new(1)
29        .with_frequency_repeated_by_seconds(60)
30        .spwan_async(CounterTask {
31            id: 1,
32            counter: counter.clone(),
33        })
34        .unwrap();
35
36    timer.add_task(task).unwrap();
37
38    println!("Task 1 added with 60-second interval.");
39    println!("Initial task count: {}", timer.task_count());
40
41    println!("\n--- Test 1: Advance task by 30 seconds ---");
42    println!("Task was scheduled for 60 seconds from now.");
43    println!("Advancing by 30 seconds...");
44
45    timer
46        .advance_task(1, Some(Duration::from_secs(30)), true)
47        .unwrap();
48
49    println!(
50        "Task 1 still exists after advance: {}",
51        timer.contains_task(1)
52    );
53
54    println!("\n--- Test 2: Trigger task immediately ---");
55    println!("Triggering task 1 immediately (None duration)...");
56
57    timer.advance_task(1, None, true).unwrap();
58
59    println!(
60        "Task 1 still exists after trigger: {}",
61        timer.contains_task(1)
62    );
63
64    println!("\n--- Test 3: Advance beyond wait time ---");
65    let task2 = TaskBuilder::new(2)
66        .with_frequency_repeated_by_seconds(60)
67        .spwan_async(CounterTask {
68            id: 2,
69            counter: counter.clone(),
70        })
71        .unwrap();
72
73    timer.add_task(task2).unwrap();
74
75    println!("Task 2 scheduled for 60 seconds, advancing by 120 seconds (beyond wait)...");
76
77    timer
78        .advance_task(2, Some(Duration::from_secs(120)), true)
79        .unwrap();
80
81    println!("Task 2 still exists: {}", timer.contains_task(2));
82
83    println!("\n--- Test 4: Advance non-existent task (error case) ---");
84
85    let result = timer.advance_task(999, Some(Duration::from_secs(30)), true);
86
87    match result {
88        Ok(_) => println!("Unexpected success!"),
89        Err(e) => println!("Expected error: {}", e),
90    }
91
92    println!("\n--- Final task count: {} ---", timer.task_count());
93
94    println!("\nExample completed. The advance_task API allows:");
95    println!("  - advance_task(id, None)        -> Trigger immediately, schedule next run");
96    println!("  - advance_task(id, Some(duration)) -> Advance by specific duration");
97    println!("  - If duration > remaining wait, triggers immediately and schedules next run");
98    println!("\nNote: For repeating tasks, after acceleration the frequency sequence");
99    println!("is reset from the current time, ensuring consistent intervals for");
100    println!("subsequent executions.");
101
102    timer.stop().await;
103}