Skip to main content

osp_cli/core/
output.rs

1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
2pub enum OutputFormat {
3    Auto,
4    Json,
5    Table,
6    Markdown,
7    Mreg,
8    Value,
9}
10
11impl OutputFormat {
12    pub fn as_str(self) -> &'static str {
13        match self {
14            OutputFormat::Auto => "auto",
15            OutputFormat::Json => "json",
16            OutputFormat::Table => "table",
17            OutputFormat::Markdown => "md",
18            OutputFormat::Mreg => "mreg",
19            OutputFormat::Value => "value",
20        }
21    }
22
23    pub fn parse(value: &str) -> Option<Self> {
24        match value.trim().to_ascii_lowercase().as_str() {
25            "auto" => Some(OutputFormat::Auto),
26            "json" => Some(OutputFormat::Json),
27            "table" => Some(OutputFormat::Table),
28            "md" | "markdown" => Some(OutputFormat::Markdown),
29            "mreg" => Some(OutputFormat::Mreg),
30            "value" => Some(OutputFormat::Value),
31            _ => None,
32        }
33    }
34}
35
36#[derive(Debug, Clone, Copy, PartialEq, Eq)]
37pub enum RenderMode {
38    Auto,
39    Plain,
40    Rich,
41}
42
43impl RenderMode {
44    pub fn as_str(self) -> &'static str {
45        match self {
46            RenderMode::Auto => "auto",
47            RenderMode::Plain => "plain",
48            RenderMode::Rich => "rich",
49        }
50    }
51
52    pub fn parse(value: &str) -> Option<Self> {
53        match value.trim().to_ascii_lowercase().as_str() {
54            "auto" => Some(RenderMode::Auto),
55            "plain" => Some(RenderMode::Plain),
56            "rich" => Some(RenderMode::Rich),
57            _ => None,
58        }
59    }
60}
61
62#[derive(Debug, Clone, Copy, PartialEq, Eq)]
63pub enum ColorMode {
64    Auto,
65    Always,
66    Never,
67}
68
69impl ColorMode {
70    pub fn as_str(self) -> &'static str {
71        match self {
72            ColorMode::Auto => "auto",
73            ColorMode::Always => "always",
74            ColorMode::Never => "never",
75        }
76    }
77
78    pub fn parse(value: &str) -> Option<Self> {
79        match value.trim().to_ascii_lowercase().as_str() {
80            "auto" => Some(ColorMode::Auto),
81            "always" => Some(ColorMode::Always),
82            "never" => Some(ColorMode::Never),
83            _ => None,
84        }
85    }
86}
87
88#[derive(Debug, Clone, Copy, PartialEq, Eq)]
89pub enum UnicodeMode {
90    Auto,
91    Always,
92    Never,
93}
94
95impl UnicodeMode {
96    pub fn as_str(self) -> &'static str {
97        match self {
98            UnicodeMode::Auto => "auto",
99            UnicodeMode::Always => "always",
100            UnicodeMode::Never => "never",
101        }
102    }
103
104    pub fn parse(value: &str) -> Option<Self> {
105        match value.trim().to_ascii_lowercase().as_str() {
106            "auto" => Some(UnicodeMode::Auto),
107            "always" => Some(UnicodeMode::Always),
108            "never" => Some(UnicodeMode::Never),
109            _ => None,
110        }
111    }
112}
113
114#[cfg(test)]
115mod tests {
116    use super::{ColorMode, OutputFormat, RenderMode, UnicodeMode};
117
118    #[test]
119    fn output_format_round_trips_known_values_and_aliases() {
120        assert_eq!(OutputFormat::Auto.as_str(), "auto");
121        assert_eq!(OutputFormat::Json.as_str(), "json");
122        assert_eq!(OutputFormat::Markdown.as_str(), "md");
123        assert_eq!(OutputFormat::parse(" json "), Some(OutputFormat::Json));
124        assert_eq!(
125            OutputFormat::parse("markdown"),
126            Some(OutputFormat::Markdown)
127        );
128        assert_eq!(OutputFormat::parse("md"), Some(OutputFormat::Markdown));
129        assert_eq!(OutputFormat::parse("wat"), None);
130    }
131
132    #[test]
133    fn render_color_and_unicode_modes_parse_case_insensitively() {
134        assert_eq!(RenderMode::Auto.as_str(), "auto");
135        assert_eq!(RenderMode::parse("RICH"), Some(RenderMode::Rich));
136        assert_eq!(RenderMode::parse("wat"), None);
137
138        assert_eq!(ColorMode::Always.as_str(), "always");
139        assert_eq!(ColorMode::parse(" never "), Some(ColorMode::Never));
140        assert_eq!(ColorMode::parse("wat"), None);
141
142        assert_eq!(UnicodeMode::Always.as_str(), "always");
143        assert_eq!(UnicodeMode::parse("AUTO"), Some(UnicodeMode::Auto));
144        assert_eq!(UnicodeMode::parse("wat"), None);
145    }
146
147    #[test]
148    fn output_modes_cover_remaining_variants() {
149        assert_eq!(OutputFormat::Table.as_str(), "table");
150        assert_eq!(OutputFormat::Mreg.as_str(), "mreg");
151        assert_eq!(OutputFormat::Value.as_str(), "value");
152        assert_eq!(OutputFormat::parse("auto"), Some(OutputFormat::Auto));
153        assert_eq!(OutputFormat::parse("mreg"), Some(OutputFormat::Mreg));
154        assert_eq!(OutputFormat::parse(" value "), Some(OutputFormat::Value));
155
156        assert_eq!(RenderMode::Plain.as_str(), "plain");
157        assert_eq!(RenderMode::Rich.as_str(), "rich");
158        assert_eq!(RenderMode::parse("plain"), Some(RenderMode::Plain));
159
160        assert_eq!(ColorMode::Auto.as_str(), "auto");
161        assert_eq!(ColorMode::parse("always"), Some(ColorMode::Always));
162
163        assert_eq!(UnicodeMode::Never.as_str(), "never");
164        assert_eq!(UnicodeMode::parse("never"), Some(UnicodeMode::Never));
165    }
166}