use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum TaskState {
Pending,
Starting,
Running,
Stopping,
Stopped,
Failed,
}
impl TaskState {
pub fn is_terminal(&self) -> bool {
matches!(self, TaskState::Stopped | TaskState::Failed)
}
pub fn can_transition_to(&self, target: TaskState) -> bool {
use TaskState::*;
match (self, target) {
(Pending, Starting) => true,
(Starting, Running) | (Starting, Failed) => true,
(Running, Stopping) | (Running, Failed) => true,
(Stopping, Stopped) | (Stopping, Failed) => true,
(Stopped, _) | (Failed, _) => false,
_ => false,
}
}
}
impl fmt::Display for TaskState {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
TaskState::Pending => write!(f, "Pending"),
TaskState::Starting => write!(f, "Starting"),
TaskState::Running => write!(f, "Running"),
TaskState::Stopping => write!(f, "Stopping"),
TaskState::Stopped => write!(f, "Stopped"),
TaskState::Failed => write!(f, "Failed"),
}
}
}