advance_task/
advance_task.rs1use 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 .spawn_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 .spawn_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}