use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum RunStatus {
#[default]
Running,
Success,
Failed,
Canceled,
Timeout,
}
impl std::fmt::Display for RunStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Running => write!(f, "running"),
Self::Success => write!(f, "success"),
Self::Failed => write!(f, "failed"),
Self::Canceled => write!(f, "canceled"),
Self::Timeout => write!(f, "timeout"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Run {
pub run_id: String,
pub job_id: String,
pub task_name: String,
pub attempt: i32,
pub status: RunStatus,
pub started_at: DateTime<Utc>,
pub finished_at: Option<DateTime<Utc>>,
pub duration_ms: Option<i64>,
pub error_message: Option<String>,
}
impl Run {
#[must_use]
pub fn new(job_id: &str, task_name: &str, attempt: i32) -> Self {
Self {
run_id: uuid::Uuid::new_v4().to_string(),
job_id: job_id.to_string(),
task_name: task_name.to_string(),
attempt,
status: RunStatus::Running,
started_at: Utc::now(),
finished_at: None,
duration_ms: None,
error_message: None,
}
}
}