#[derive(Clone, Debug, PartialEq, Eq)]
pub enum WorkflowState {
Started,
InProgress(String),
Suspended {
key: String,
status: String,
},
Completed(Option<String>),
Failed(String),
}
impl WorkflowState {
#[must_use]
pub fn is_terminal(&self) -> bool {
matches!(self, Self::Completed(_) | Self::Failed(_))
}
#[must_use]
pub fn message(&self) -> Option<&str> {
match self {
Self::InProgress(msg) | Self::Failed(msg) => Some(msg),
Self::Suspended { status, .. } => Some(status),
Self::Completed(msg) => msg.as_deref(),
Self::Started => None,
}
}
}
impl std::fmt::Display for WorkflowState {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Started => write!(f, "started"),
Self::InProgress(msg) => write!(f, "in progress: {msg}"),
Self::Suspended { key, status } => write!(f, "suspended ({key}): {status}"),
Self::Completed(None) => write!(f, "completed"),
Self::Completed(Some(msg)) => write!(f, "completed: {msg}"),
Self::Failed(msg) => write!(f, "failed: {msg}"),
}
}
}