use super::CronSchedule;
use chrono::{DateTime, Utc};
use chrono_tz::{Asia::Shanghai, Tz};
use std::time::Duration;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct StaggeredIntervalSchedule {
pub every: Duration,
pub seed: Option<String>,
}
impl StaggeredIntervalSchedule {
pub fn new(every: Duration) -> Self {
Self { every, seed: None }
}
pub fn with_seed(mut self, seed: impl Into<String>) -> Self {
self.seed = Some(seed.into());
self
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Schedule {
Interval(Duration),
StaggeredInterval(StaggeredIntervalSchedule),
AtTimes(Vec<DateTime<Tz>>),
Cron(CronSchedule),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum MissedRunPolicy {
Skip,
#[default]
CatchUpOnce,
ReplayAll,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum OverlapPolicy {
#[default]
Forbid,
QueueOne,
AllowParallel,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum TerminalStatePolicy {
#[default]
Retain,
Delete,
}
#[derive(Debug, Clone)]
pub struct SchedulerConfig {
pub timezone: Tz,
pub history_limit: usize,
pub terminal_state_policy: TerminalStatePolicy,
}
impl Default for SchedulerConfig {
fn default() -> Self {
Self {
timezone: Shanghai,
history_limit: 32,
terminal_state_policy: TerminalStatePolicy::Retain,
}
}
}
impl Schedule {
pub fn staggered_interval(every: Duration) -> Self {
Self::StaggeredInterval(StaggeredIntervalSchedule::new(every))
}
pub fn staggered_interval_with_seed(every: Duration, seed: impl Into<String>) -> Self {
Self::StaggeredInterval(StaggeredIntervalSchedule::new(every).with_seed(seed))
}
}
pub(crate) fn utc_time(value: DateTime<Tz>) -> DateTime<Utc> {
value.with_timezone(&Utc)
}