agm_core/model/
execution.rs1use 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}