use crate::common::{ListenerId, PhaseId, TaskId};
use crate::time::TickEvent;
use chrono::{NaiveDate, NaiveTime};
use std::any::Any;
use std::sync::Arc;
use tokio::time::Instant;
#[derive(Debug, Clone)]
pub struct PhaseEvent {
pub phase: PhaseId,
pub tick: Arc<TickEvent>,
}
#[derive(Debug, Clone)]
pub enum SystemEvent {
EngineStarted { timestamp: Instant },
EngineShutdown,
ListenerAdded { id: ListenerId },
ListenerRemoved { id: ListenerId },
}
#[derive(Debug, Clone)]
pub enum GongEvent {
DateChanged { new_date: NaiveDate },
TimeOfDay(TimeOfDay),
WorkdayMilestone(WorkdayMilestone),
Holiday { name: String, date: NaiveDate },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TimeOfDay {
Noon,
Midnight,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct WorkdayMilestone {
pub label: &'static str,
pub time: NaiveTime,
}
#[derive(Debug, Clone)]
pub enum TaskEvent {
TaskScheduled { id: TaskId },
TaskFired {
listener_id: ListenerId,
tick: Arc<TickEvent>,
},
TaskCompleted { id: TaskId },
}
#[derive(Debug, Clone)]
pub enum AutomationEvent {
LifecycleStarted { id: TaskId },
LifecycleStepAdvanced { id: TaskId, step_index: usize },
LifecycleCompleted { id: TaskId },
LifecycleLooped { id: TaskId },
}
#[derive(Debug, Clone)]
pub struct ConditionalEvent {
pub condition_id: ListenerId,
pub timestamp: Instant,
}
#[derive(Clone)]
pub struct UserEvent {
pub name: String,
pub payload: Arc<dyn Any + Send + Sync>,
}
impl std::fmt::Debug for UserEvent {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("UserEvent")
.field("name", &self.name)
.field("payload", &"...")
.finish()
}
}