use std::time::{Duration, SystemTime};
use serde::Serialize;
use uuid::Uuid;
use crate::{IndexMap, JobDefinition};
#[derive(Debug, Clone)]
#[must_use]
pub struct ScheduleDefinition {
pub job_timing_policy: ScheduleJobTimingPolicy,
pub job_creation_policy: ScheduleJobCreationPolicy,
pub labels: IndexMap<String, String>,
pub time_range: Option<ScheduleTimeRange>,
pub metadata_json: Option<String>,
pub propagate_labels_to_jobs: bool,
}
impl ScheduleDefinition {
pub fn immediate(mut self) -> Self {
match &mut self.job_timing_policy {
ScheduleJobTimingPolicy::Repeat(policy) => policy.immediate = true,
ScheduleJobTimingPolicy::Cron(policy) => policy.immediate = true,
}
self
}
pub fn start_after(mut self, start: SystemTime) -> Self {
if let Some(time_range) = self.time_range.as_mut() {
time_range.start = Some(start);
} else {
self.time_range = Some(ScheduleTimeRange {
start: Some(start),
end: None,
});
}
self
}
pub fn end_before(mut self, end: SystemTime) -> Self {
if let Some(time_range) = self.time_range.as_mut() {
time_range.end = Some(end);
} else {
self.time_range = Some(ScheduleTimeRange {
start: None,
end: Some(end),
});
}
self
}
pub fn with_label(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
self.labels.insert(key.into(), value.into());
self
}
pub fn with_label_json(mut self, key: impl Into<String>, value: impl Serialize) -> Self {
self.labels.insert(
key.into(),
serde_json::to_string(&value).expect("label serialization failed"),
);
self
}
pub fn replace_metadata(mut self, metadata: impl Serialize) -> Self {
self.metadata_json =
Some(serde_json::to_string(&metadata).expect("metadata serialization failed"));
self
}
pub fn propagate_labels(mut self, propagate: bool) -> Self {
self.propagate_labels_to_jobs = propagate;
self
}
}
#[derive(Debug, Clone)]
pub enum ScheduleJobTimingPolicy {
Repeat(ScheduleJobTimingPolicyRepeat),
Cron(ScheduleJobTimingPolicyCron),
}
#[derive(Debug, Clone)]
pub struct ScheduleJobTimingPolicyRepeat {
pub interval: Duration,
pub immediate: bool,
pub missed_time_policy: ScheduleMissedTimePolicy,
}
#[derive(Debug, Clone)]
pub struct ScheduleJobTimingPolicyCron {
pub cron_expression: String,
pub immediate: bool,
pub missed_time_policy: ScheduleMissedTimePolicy,
}
#[derive(Debug, Default, Clone, Copy)]
pub enum ScheduleMissedTimePolicy {
#[default]
Skip,
Create,
}
#[derive(Debug, Clone)]
pub enum ScheduleJobCreationPolicy {
JobDefinition(JobDefinition),
}
#[derive(Debug, Clone, Copy)]
pub struct ScheduleTimeRange {
pub start: Option<SystemTime>,
pub end: Option<SystemTime>,
}
#[derive(Debug, Clone)]
pub struct ScheduleDetails {
pub id: Uuid,
pub created_at: SystemTime,
pub job_timing_policy: ScheduleJobTimingPolicy,
pub job_creation_policy: ScheduleJobCreationPolicy,
pub labels: IndexMap<String, String>,
pub active: bool,
pub cancelled: bool,
pub time_range: Option<ScheduleTimeRange>,
pub metadata_json: Option<String>,
}