use async_trait::async_trait;
use foxtive_cron::contracts::{JobContract, Schedule, ValidatedSchedule};
use foxtive_cron::{Cron, CronResult};
use std::borrow::Cow;
use std::time::Duration;
struct JobWithPriority {
id: String,
priority: i32,
schedule: ValidatedSchedule,
}
#[async_trait]
impl JobContract for JobWithPriority {
async fn run(&self) -> CronResult<()> {
println!(
"[{}] Executing (priority: {}). Timestamp: {}",
self.id,
self.priority,
chrono::Utc::now()
);
tokio::time::sleep(Duration::from_millis(100)).await;
Ok(())
}
fn id(&self) -> Cow<'_, str> {
Cow::Borrowed(&self.id)
}
fn name(&self) -> Cow<'_, str> {
Cow::Borrowed("Priority Job")
}
fn schedule(&self) -> &dyn Schedule {
&self.schedule
}
fn priority(&self) -> i32 {
self.priority
}
}
#[tokio::main]
async fn main() {
let mut cron = Cron::builder().with_global_concurrency_limit(1).build();
let every_5_sec = ValidatedSchedule::parse("*/5 * * * * * *").unwrap();
let high_prio = JobWithPriority {
id: "high-prio-task".to_string(),
priority: 100,
schedule: every_5_sec.clone(),
};
let med_prio = JobWithPriority {
id: "med-prio-task".to_string(),
priority: 50,
schedule: every_5_sec.clone(),
};
let low_prio = JobWithPriority {
id: "low-prio-task".to_string(),
priority: 0,
schedule: every_5_sec.clone(),
};
cron.add_job(med_prio).unwrap();
cron.add_job(low_prio).unwrap();
cron.add_job(high_prio).unwrap();
println!("Scheduler starting with prioritized jobs...");
cron.run().await;
}