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}