use super::{ActivityTally, LifecycleEvent, RunLink, RunRecord, RunState};
use crate::{ActorId, WorkStatus};
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ObservedStatus {
Working,
Waiting,
Failed,
Interrupted,
Completed,
Stale,
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum LineageStatus {
Current,
Foreign,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "reason", rename_all = "snake_case")]
pub enum Orphan {
OwnerChanged {
owner: Option<ActorId>,
},
NotExecuting {
status: WorkStatus,
},
WorkMissing,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct RunSnapshot {
pub record: RunRecord,
pub last: LifecycleEvent,
pub activity: ActivityTally,
pub operations: Vec<RunLink>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct RunView {
pub run: RunRecord,
pub state: RunState,
pub state_since: DateTime<Utc>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub state_detail: Option<String>,
pub status: ObservedStatus,
pub last_receipt_at: DateTime<Utc>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub stale_at: Option<DateTime<Utc>>,
pub activity: ActivityTally,
pub lineage: LineageStatus,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub orphan: Option<Orphan>,
pub operations: Vec<RunLink>,
pub evaluated_at: DateTime<Utc>,
}