Skip to main content

agm_core/model/
execution.rs

1//! Execution state types (spec S26).
2
3use serde::{Deserialize, Serialize};
4use std::fmt;
5use std::str::FromStr;
6
7use super::fields::ParseEnumError;
8
9#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
10#[serde(rename_all = "snake_case")]
11pub enum ExecutionStatus {
12    Pending,
13    Ready,
14    InProgress,
15    Completed,
16    Failed,
17    Blocked,
18    Skipped,
19}
20
21impl fmt::Display for ExecutionStatus {
22    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
23        match self {
24            Self::Pending => write!(f, "pending"),
25            Self::Ready => write!(f, "ready"),
26            Self::InProgress => write!(f, "in_progress"),
27            Self::Completed => write!(f, "completed"),
28            Self::Failed => write!(f, "failed"),
29            Self::Blocked => write!(f, "blocked"),
30            Self::Skipped => write!(f, "skipped"),
31        }
32    }
33}
34
35impl FromStr for ExecutionStatus {
36    type Err = ParseEnumError;
37
38    fn from_str(s: &str) -> Result<Self, Self::Err> {
39        match s {
40            "pending" => Ok(Self::Pending),
41            "ready" => Ok(Self::Ready),
42            "in_progress" => Ok(Self::InProgress),
43            "completed" => Ok(Self::Completed),
44            "failed" => Ok(Self::Failed),
45            "blocked" => Ok(Self::Blocked),
46            "skipped" => Ok(Self::Skipped),
47            _ => Err(ParseEnumError {
48                type_name: "ExecutionStatus",
49                value: s.to_owned(),
50            }),
51        }
52    }
53}
54
55#[cfg(test)]
56mod tests {
57    use super::*;
58
59    #[test]
60    fn test_execution_status_from_str_valid_returns_ok() {
61        assert_eq!(
62            "pending".parse::<ExecutionStatus>().unwrap(),
63            ExecutionStatus::Pending
64        );
65        assert_eq!(
66            "ready".parse::<ExecutionStatus>().unwrap(),
67            ExecutionStatus::Ready
68        );
69        assert_eq!(
70            "in_progress".parse::<ExecutionStatus>().unwrap(),
71            ExecutionStatus::InProgress
72        );
73        assert_eq!(
74            "completed".parse::<ExecutionStatus>().unwrap(),
75            ExecutionStatus::Completed
76        );
77        assert_eq!(
78            "failed".parse::<ExecutionStatus>().unwrap(),
79            ExecutionStatus::Failed
80        );
81        assert_eq!(
82            "blocked".parse::<ExecutionStatus>().unwrap(),
83            ExecutionStatus::Blocked
84        );
85        assert_eq!(
86            "skipped".parse::<ExecutionStatus>().unwrap(),
87            ExecutionStatus::Skipped
88        );
89    }
90
91    #[test]
92    fn test_execution_status_from_str_invalid_returns_error() {
93        let err = "running".parse::<ExecutionStatus>().unwrap_err();
94        assert_eq!(err.type_name, "ExecutionStatus");
95        assert_eq!(err.value, "running");
96    }
97
98    #[test]
99    fn test_execution_status_display_roundtrip() {
100        for s in [
101            ExecutionStatus::Pending,
102            ExecutionStatus::Ready,
103            ExecutionStatus::InProgress,
104            ExecutionStatus::Completed,
105            ExecutionStatus::Failed,
106            ExecutionStatus::Blocked,
107            ExecutionStatus::Skipped,
108        ] {
109            let text = s.to_string();
110            assert_eq!(text.parse::<ExecutionStatus>().unwrap(), s);
111        }
112    }
113
114    #[test]
115    fn test_execution_status_serde_roundtrip() {
116        for s in [
117            ExecutionStatus::Pending,
118            ExecutionStatus::InProgress,
119            ExecutionStatus::Completed,
120        ] {
121            let json = serde_json::to_string(&s).unwrap();
122            let back: ExecutionStatus = serde_json::from_str(&json).unwrap();
123            assert_eq!(s, back);
124        }
125    }
126
127    #[test]
128    fn test_execution_status_in_progress_serde_value() {
129        let json = serde_json::to_string(&ExecutionStatus::InProgress).unwrap();
130        assert_eq!(json, "\"in_progress\"");
131    }
132}