use std::any::Any;
use std::time::{Duration, SystemTime};
mod cron;
pub use cron::CronSchedule;
mod descriptor;
pub use descriptor::ScheduleDescriptor;
pub trait Schedule: Any {
fn next_call_at(&self, last_run_at: Option<SystemTime>) -> Option<SystemTime>;
fn describe(&self) -> Option<ScheduleDescriptor> {
None
}
}
pub struct DeltaSchedule {
interval: Duration,
}
impl DeltaSchedule {
pub fn new(interval: Duration) -> DeltaSchedule {
DeltaSchedule { interval }
}
pub fn interval(&self) -> Duration {
self.interval
}
}
impl Schedule for DeltaSchedule {
fn next_call_at(&self, last_run_at: Option<SystemTime>) -> Option<SystemTime> {
match last_run_at {
Some(last_run_at) => Some(
last_run_at
.checked_add(self.interval)
.expect("Invalid SystemTime encountered"),
),
None => Some(SystemTime::now()),
}
}
fn describe(&self) -> Option<ScheduleDescriptor> {
Some(ScheduleDescriptor::delta(self.interval))
}
}