use crate::database::universal_types::{UniversalTimestamp, UniversalUuid};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExecutionEvent {
pub id: UniversalUuid,
pub pipeline_execution_id: UniversalUuid,
pub task_execution_id: Option<UniversalUuid>,
pub event_type: String,
pub event_data: Option<String>,
pub worker_id: Option<String>,
pub created_at: UniversalTimestamp,
pub sequence_num: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NewExecutionEvent {
pub pipeline_execution_id: UniversalUuid,
pub task_execution_id: Option<UniversalUuid>,
pub event_type: String,
pub event_data: Option<String>,
pub worker_id: Option<String>,
}
impl NewExecutionEvent {
pub fn pipeline_event(
pipeline_execution_id: UniversalUuid,
event_type: ExecutionEventType,
event_data: Option<String>,
worker_id: Option<String>,
) -> Self {
Self {
pipeline_execution_id,
task_execution_id: None,
event_type: event_type.as_str().to_string(),
event_data,
worker_id,
}
}
pub fn task_event(
pipeline_execution_id: UniversalUuid,
task_execution_id: UniversalUuid,
event_type: ExecutionEventType,
event_data: Option<String>,
worker_id: Option<String>,
) -> Self {
Self {
pipeline_execution_id,
task_execution_id: Some(task_execution_id),
event_type: event_type.as_str().to_string(),
event_data,
worker_id,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ExecutionEventType {
TaskCreated,
TaskMarkedReady,
TaskClaimed,
TaskStarted,
TaskDeferred,
TaskResumed,
TaskCompleted,
TaskFailed,
TaskRetryScheduled,
TaskSkipped,
TaskAbandoned,
TaskReset,
PipelineStarted,
PipelineCompleted,
PipelineFailed,
PipelinePaused,
PipelineResumed,
}
impl ExecutionEventType {
pub fn as_str(&self) -> &'static str {
match self {
ExecutionEventType::TaskCreated => "task_created",
ExecutionEventType::TaskMarkedReady => "task_marked_ready",
ExecutionEventType::TaskClaimed => "task_claimed",
ExecutionEventType::TaskStarted => "task_started",
ExecutionEventType::TaskDeferred => "task_deferred",
ExecutionEventType::TaskResumed => "task_resumed",
ExecutionEventType::TaskCompleted => "task_completed",
ExecutionEventType::TaskFailed => "task_failed",
ExecutionEventType::TaskRetryScheduled => "task_retry_scheduled",
ExecutionEventType::TaskSkipped => "task_skipped",
ExecutionEventType::TaskAbandoned => "task_abandoned",
ExecutionEventType::TaskReset => "task_reset",
ExecutionEventType::PipelineStarted => "pipeline_started",
ExecutionEventType::PipelineCompleted => "pipeline_completed",
ExecutionEventType::PipelineFailed => "pipeline_failed",
ExecutionEventType::PipelinePaused => "pipeline_paused",
ExecutionEventType::PipelineResumed => "pipeline_resumed",
}
}
#[allow(clippy::should_implement_trait)]
pub fn from_str(s: &str) -> Option<Self> {
match s {
"task_created" => Some(ExecutionEventType::TaskCreated),
"task_marked_ready" => Some(ExecutionEventType::TaskMarkedReady),
"task_claimed" => Some(ExecutionEventType::TaskClaimed),
"task_started" => Some(ExecutionEventType::TaskStarted),
"task_deferred" => Some(ExecutionEventType::TaskDeferred),
"task_resumed" => Some(ExecutionEventType::TaskResumed),
"task_completed" => Some(ExecutionEventType::TaskCompleted),
"task_failed" => Some(ExecutionEventType::TaskFailed),
"task_retry_scheduled" => Some(ExecutionEventType::TaskRetryScheduled),
"task_skipped" => Some(ExecutionEventType::TaskSkipped),
"task_abandoned" => Some(ExecutionEventType::TaskAbandoned),
"task_reset" => Some(ExecutionEventType::TaskReset),
"pipeline_started" => Some(ExecutionEventType::PipelineStarted),
"pipeline_completed" => Some(ExecutionEventType::PipelineCompleted),
"pipeline_failed" => Some(ExecutionEventType::PipelineFailed),
"pipeline_paused" => Some(ExecutionEventType::PipelinePaused),
"pipeline_resumed" => Some(ExecutionEventType::PipelineResumed),
_ => None,
}
}
pub fn is_task_event(&self) -> bool {
matches!(
self,
ExecutionEventType::TaskCreated
| ExecutionEventType::TaskMarkedReady
| ExecutionEventType::TaskClaimed
| ExecutionEventType::TaskStarted
| ExecutionEventType::TaskDeferred
| ExecutionEventType::TaskResumed
| ExecutionEventType::TaskCompleted
| ExecutionEventType::TaskFailed
| ExecutionEventType::TaskRetryScheduled
| ExecutionEventType::TaskSkipped
| ExecutionEventType::TaskAbandoned
| ExecutionEventType::TaskReset
)
}
pub fn is_pipeline_event(&self) -> bool {
matches!(
self,
ExecutionEventType::PipelineStarted
| ExecutionEventType::PipelineCompleted
| ExecutionEventType::PipelineFailed
| ExecutionEventType::PipelinePaused
| ExecutionEventType::PipelineResumed
)
}
}
impl From<ExecutionEventType> for String {
fn from(event_type: ExecutionEventType) -> Self {
event_type.as_str().to_string()
}
}
impl std::fmt::Display for ExecutionEventType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.as_str())
}
}