use schedules::{CallbackHandler, Scheduler, SchedulerState, TickEvent};
use std::fs;
use std::future::Future;
use std::path::Path;
use std::pin::Pin;
use std::thread;
use std::time::Duration;
struct CountHandler {
name: String,
count: u32,
}
impl CountHandler {
fn new(name: impl Into<String>) -> Self {
CountHandler {
name: name.into(),
count: 0,
}
}
}
impl CallbackHandler for CountHandler {
fn handle(&self, event: TickEvent) {
println!(
"Handler '{}' executed for schedule: {} (count: {})",
self.name, event.schedule_name, self.count
);
}
fn handle_async<'a>(
&'a self,
event: TickEvent,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'a>> {
Box::pin(async move { self.handle(event) })
}
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let state_file = "scheduler_state.json";
let mut scheduler = if Path::new(state_file).exists() {
println!("Restoring scheduler from saved state...");
let contents = fs::read_to_string(state_file)?;
let state: SchedulerState = serde_json::from_str(&contents)?;
Scheduler::restore(state)?
} else {
println!("Creating a new scheduler...");
Scheduler::new()
};
scheduler.register_callback("counter_1", Box::new(CountHandler::new("Counter 1")))?;
scheduler.register_callback("counter_2", Box::new(CountHandler::new("Counter 2")))?;
if !Path::new(state_file).exists() {
println!("Creating schedules...");
scheduler
.every(Duration::from_secs(5))
.with_name("five_second_tick")
.with_callback_id("counter_1")
.build()?;
scheduler
.every(Duration::from_secs(10))
.with_name("ten_second_tick")
.with_callback_id("counter_2")
.build()?;
}
println!("Starting scheduler...");
scheduler.start();
println!("Running for 30 seconds...");
thread::sleep(Duration::from_secs(30));
println!("Stopping scheduler...");
scheduler.stop();
println!("Saving scheduler state...");
let state = scheduler.freeze()?;
let serialized = serde_json::to_string_pretty(&state)?;
fs::write(state_file, serialized)?;
println!("Scheduler state saved to {}", state_file);
println!("Run this example again to restore the state!");
Ok(())
}