mod engine;
mod state;
pub use engine::{Scheduler, SchedulerHandle};
pub use state::{ScheduledJob, SchedulerState};
use crate::config::Job;
use chrono::{DateTime, Utc};
use uuid::Uuid;
#[derive(Debug)]
pub enum SchedulerMessage {
TriggerJob { job_name: String },
ReloadConfig,
GetStatus {
response_tx: tokio::sync::oneshot::Sender<SchedulerState>,
},
StopJob { job_name: String },
Shutdown,
}
#[derive(Debug, Clone)]
pub enum SchedulerEvent {
JobStarting {
job_name: String,
execution_id: Uuid,
},
JobCompleted {
job_name: String,
execution_id: Uuid,
success: bool,
duration_ms: u64,
},
JobFailed {
job_name: String,
execution_id: Uuid,
error: String,
},
ConfigReloaded { job_count: usize },
Started,
Stopped,
}
#[derive(Debug, Clone)]
pub struct JobTrigger {
pub job_name: String,
pub scheduled_at: DateTime<Utc>,
pub job: Job,
}
impl JobTrigger {
pub fn new(job_name: String, scheduled_at: DateTime<Utc>, job: Job) -> Self {
Self {
job_name,
scheduled_at,
job,
}
}
pub fn is_due(&self) -> bool {
Utc::now() >= self.scheduled_at
}
pub fn ms_until_due(&self) -> i64 {
let now = Utc::now();
(self.scheduled_at - now).num_milliseconds().max(0)
}
}