pitchfork_cli/
daemon_status.rs1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize, strum::Display, strum::EnumIs)]
4#[strum(serialize_all = "snake_case")]
5#[serde(rename_all = "snake_case")]
6pub enum DaemonStatus {
7 Failed(String),
8 Waiting,
9 Running,
10 Stopping,
11 Errored(Option<i32>),
12 Stopped,
13}
14
15impl DaemonStatus {
16 pub fn style(&self) -> String {
17 let s = self.to_string();
18 match self {
19 DaemonStatus::Failed(_) => console::style(s).red().to_string(),
20 DaemonStatus::Waiting => console::style(s).yellow().to_string(),
21 DaemonStatus::Running => console::style(s).green().to_string(),
22 DaemonStatus::Stopping => console::style(s).yellow().to_string(),
23 DaemonStatus::Stopped => console::style(s).dim().to_string(),
24 DaemonStatus::Errored(_) => console::style(s).red().to_string(),
25 }
26 }
27
28 pub fn error_message(&self) -> Option<String> {
29 match self {
30 DaemonStatus::Failed(msg) => Some(msg.clone()),
31 DaemonStatus::Errored(Some(code)) => Some(format!("exit code {code}")),
32 DaemonStatus::Errored(None) => Some("unknown exit code".to_string()),
33 _ => None,
34 }
35 }
36}
37
38#[cfg(test)]
39mod tests {
40 use super::*;
41
42 #[test]
43 fn test_daemon_status_json_roundtrip() {
44 let variants = vec![
45 ("running", DaemonStatus::Running),
46 ("stopped", DaemonStatus::Stopped),
47 ("waiting", DaemonStatus::Waiting),
48 ("stopping", DaemonStatus::Stopping),
49 ("failed", DaemonStatus::Failed("some error".to_string())),
50 ("errored_some", DaemonStatus::Errored(Some(1))),
51 ("errored_none", DaemonStatus::Errored(None)),
52 ];
53
54 for (name, status) in variants {
55 let json_str = serde_json::to_string(&status)
56 .unwrap_or_else(|_| panic!("Failed to serialize {name}"));
57 println!("Status {name}: {json_str}");
58
59 let result: Result<DaemonStatus, _> = serde_json::from_str(&json_str);
60 assert!(
61 result.is_ok(),
62 "Failed to deserialize {name}: {:?}",
63 result.err()
64 );
65 }
66 }
67}