Skip to main content

kojin_core/
state.rs

1use serde::{Deserialize, Serialize};
2
3/// Lifecycle state of a task.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
5#[serde(rename_all = "snake_case")]
6pub enum TaskState {
7    Pending,
8    Received,
9    Started,
10    Success,
11    Failure,
12    Retry,
13    Revoked,
14    DeadLettered,
15}
16
17impl TaskState {
18    /// Whether the task is in a terminal state.
19    pub fn is_terminal(&self) -> bool {
20        matches!(
21            self,
22            TaskState::Success | TaskState::Failure | TaskState::Revoked | TaskState::DeadLettered
23        )
24    }
25
26    /// Whether the task is still in progress.
27    pub fn is_active(&self) -> bool {
28        matches!(
29            self,
30            TaskState::Pending | TaskState::Received | TaskState::Started | TaskState::Retry
31        )
32    }
33}
34
35impl std::fmt::Display for TaskState {
36    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
37        let s = match self {
38            TaskState::Pending => "pending",
39            TaskState::Received => "received",
40            TaskState::Started => "started",
41            TaskState::Success => "success",
42            TaskState::Failure => "failure",
43            TaskState::Retry => "retry",
44            TaskState::Revoked => "revoked",
45            TaskState::DeadLettered => "dead_lettered",
46        };
47        f.write_str(s)
48    }
49}