use chrono::{DateTime, Utc};
use sayiir_core::snapshot::{ExecutionPosition, WorkflowSnapshot, WorkflowSnapshotState};
pub(crate) fn status_str(state: &WorkflowSnapshotState) -> &str {
state.as_ref()
}
pub(crate) fn current_task_id(snapshot: &WorkflowSnapshot) -> Option<&str> {
match &snapshot.state {
WorkflowSnapshotState::InProgress {
position: ExecutionPosition::AtTask { task_id },
..
} => Some(task_id.as_str()),
_ => None,
}
}
pub(crate) fn completed_task_count(snapshot: &WorkflowSnapshot) -> i32 {
match &snapshot.state {
WorkflowSnapshotState::InProgress {
completed_tasks, ..
}
| WorkflowSnapshotState::Cancelled {
completed_tasks, ..
}
| WorkflowSnapshotState::Paused {
completed_tasks, ..
} => completed_tasks.len().try_into().unwrap_or(i32::MAX),
_ => 0,
}
}
pub(crate) fn error_message(snapshot: &WorkflowSnapshot) -> Option<&str> {
match &snapshot.state {
WorkflowSnapshotState::Failed { error } => Some(error.as_str()),
_ => None,
}
}
pub(crate) fn is_terminal(snapshot: &WorkflowSnapshot) -> bool {
snapshot.state.is_terminal()
}
pub(crate) fn position_kind(snapshot: &WorkflowSnapshot) -> Option<&str> {
match &snapshot.state {
WorkflowSnapshotState::InProgress { position, .. }
| WorkflowSnapshotState::Paused { position, .. } => Some(position.as_ref()),
_ => None,
}
}
pub(crate) fn delay_wake_at(snapshot: &WorkflowSnapshot) -> Option<DateTime<Utc>> {
match &snapshot.state {
WorkflowSnapshotState::InProgress {
position: ExecutionPosition::AtDelay { wake_at, .. },
..
}
| WorkflowSnapshotState::InProgress {
position:
ExecutionPosition::AtSignal {
wake_at: Some(wake_at),
..
},
..
} => Some(*wake_at),
_ => None,
}
}