Skip to main content

pitchfork_cli/
daemon_status.rs

1use 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}