1use std::fmt::{Display, Formatter};
2use std::str::FromStr;
3
4use proptest_derive::Arbitrary;
5
6use crate::to_command::{ToArg, ToCommand};
7
8#[derive(Debug, Clone, Hash, Ord, PartialOrd, Eq, PartialEq, Arbitrary)]
9pub enum YesNo {
11 Yes,
13 No,
15}
16
17impl Display for YesNo {
18 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
19 match self {
20 YesNo::Yes => write!(f, "yes"),
21 YesNo::No => write!(f, "no"),
22 }
23 }
24}
25impl FromStr for YesNo {
26 type Err = ();
27
28 fn from_str(s: &str) -> Result<Self, Self::Err> {
29 match s {
30 "yes" => Ok(YesNo::Yes),
31 "no" => Ok(YesNo::No),
32 _ => Err(()),
33 }
34 }
35}
36
37impl ToCommand for YesNo {
38 fn to_args(&self) -> Vec<String> {
39 let mut cmd = vec![];
40 match self {
41 YesNo::Yes => {
42 cmd.push("yes".to_string());
43 }
44 YesNo::No => {
45 cmd.push("no".to_string());
46 }
47 }
48 cmd
49 }
50}
51
52impl ToArg for YesNo {
53 fn to_arg(&self) -> &str {
54 match self {
55 YesNo::Yes => "yes",
56 YesNo::No => "no",
57 }
58 }
59}
60
61#[derive(Debug, Clone, Hash, Ord, PartialOrd, Eq, PartialEq, Arbitrary)]
62pub enum OnOff {
64 On,
66 Off,
68}
69
70impl Display for OnOff {
71 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
72 match self {
73 OnOff::On => write!(f, "on"),
74 OnOff::Off => write!(f, "off"),
75 }
76 }
77}
78
79impl FromStr for OnOff {
80 type Err = ();
81
82 fn from_str(s: &str) -> Result<Self, Self::Err> {
83 match s {
84 "on" => Ok(OnOff::On),
85 "off" => Ok(OnOff::Off),
86 _ => Err(()),
87 }
88 }
89}
90
91impl ToCommand for OnOff {
92 fn to_args(&self) -> Vec<String> {
93 let mut cmd = vec![];
94 match self {
95 OnOff::On => {
96 cmd.push("on".to_string());
97 }
98 OnOff::Off => {
99 cmd.push("off".to_string());
100 }
101 }
102 cmd
103 }
104}
105
106impl ToArg for OnOff {
107 fn to_arg(&self) -> &str {
108 match self {
109 OnOff::On => "on",
110 OnOff::Off => "off",
111 }
112 }
113}
114
115#[derive(Debug, Clone, Hash, Ord, PartialOrd, Eq, PartialEq, Default, Arbitrary)]
116pub enum OnOffAuto {
120 On,
122 Off,
124 #[default]
126 Auto,
127}
128
129impl FromStr for OnOffAuto {
130 type Err = ();
131
132 fn from_str(s: &str) -> Result<Self, Self::Err> {
133 match s {
134 "on" => Ok(OnOffAuto::On),
135 "off" => Ok(OnOffAuto::Off),
136 "auto" => Ok(OnOffAuto::Auto),
137 _ => Err(()),
138 }
139 }
140}
141
142impl Display for OnOffAuto {
143 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
144 match self {
145 OnOffAuto::On => write!(f, "on"),
146 OnOffAuto::Off => write!(f, "off"),
147 OnOffAuto::Auto => write!(f, "auto"),
148 }
149 }
150}
151impl ToCommand for OnOffAuto {
152 fn to_args(&self) -> Vec<String> {
153 let mut cmd = vec![];
154 match self {
155 OnOffAuto::On => {
156 cmd.push("on".to_string());
157 }
158 OnOffAuto::Off => {
159 cmd.push("off".to_string());
160 }
161 OnOffAuto::Auto => {
162 cmd.push("auto".to_string());
163 }
164 }
165 cmd
166 }
167}
168
169impl ToArg for OnOffAuto {
170 fn to_arg(&self) -> &str {
171 match self {
172 OnOffAuto::On => "on",
173 OnOffAuto::Off => "off",
174 OnOffAuto::Auto => "auto",
175 }
176 }
177}
178
179#[derive(Debug, Clone, Hash, Ord, PartialOrd, Eq, PartialEq, Default, Arbitrary)]
180pub enum OnOffDefaultOn {
184 #[default]
186 On,
187 Off,
189}
190
191impl FromStr for OnOffDefaultOn {
192 type Err = ();
193
194 fn from_str(s: &str) -> Result<Self, Self::Err> {
195 match s {
196 "on" => Ok(OnOffDefaultOn::On),
197 "off" => Ok(OnOffDefaultOn::Off),
198 _ => Err(()),
199 }
200 }
201}
202
203impl Display for OnOffDefaultOn {
204 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
205 match self {
206 OnOffDefaultOn::On => write!(f, "on"),
207 OnOffDefaultOn::Off => write!(f, "off"),
208 }
209 }
210}
211impl ToCommand for OnOffDefaultOn {
212 fn to_args(&self) -> Vec<String> {
213 let mut cmd = vec![];
214 match self {
215 OnOffDefaultOn::On => {
216 cmd.push("on".to_string());
217 }
218 OnOffDefaultOn::Off => {
219 cmd.push("off".to_string());
220 }
221 }
222 cmd
223 }
224}
225
226impl ToArg for OnOffDefaultOn {
227 fn to_arg(&self) -> &str {
228 match self {
229 OnOffDefaultOn::On => "on",
230 OnOffDefaultOn::Off => "off",
231 }
232 }
233}
234
235#[derive(Debug, Clone, Hash, Ord, PartialOrd, Eq, PartialEq, Default, Arbitrary)]
236pub enum OnOffDefaultOff {
240 On,
242 #[default]
244 Off,
245}
246
247impl Display for OnOffDefaultOff {
248 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
249 match self {
250 OnOffDefaultOff::On => write!(f, "on"),
251 OnOffDefaultOff::Off => write!(f, "off"),
252 }
253 }
254}
255
256impl FromStr for OnOffDefaultOff {
257 type Err = ();
258
259 fn from_str(s: &str) -> Result<Self, Self::Err> {
260 match s {
261 "on" => Ok(OnOffDefaultOff::On),
262 "off" => Ok(OnOffDefaultOff::Off),
263 _ => Err(()),
264 }
265 }
266}
267
268impl ToCommand for OnOffDefaultOff {
269 fn to_args(&self) -> Vec<String> {
270 let mut cmd = vec![];
271 match self {
272 OnOffDefaultOff::On => {
273 cmd.push("on".to_string());
274 }
275 OnOffDefaultOff::Off => {
276 cmd.push("off".to_string());
277 }
278 }
279 cmd
280 }
281}
282
283impl ToArg for OnOffDefaultOff {
284 fn to_arg(&self) -> &str {
285 match self {
286 OnOffDefaultOff::On => "on",
287 OnOffDefaultOff::Off => "off",
288 }
289 }
290}
291
292#[derive(Debug, Clone, Hash, Ord, PartialOrd, Eq, PartialEq, Default, Arbitrary)]
293pub enum AccelType {
297 Kvm,
299 Xen,
301 Hvf,
303 Nitro,
305 Nvmm,
307 Whpx,
309 Mshv,
311 #[default]
313 Tcg,
314}
315
316impl ToArg for AccelType {
317 fn to_arg(&self) -> &str {
318 match self {
319 AccelType::Kvm => "kvm",
320 AccelType::Xen => "xen",
321 AccelType::Hvf => "hvf",
322 AccelType::Nitro => "nitro",
323 AccelType::Nvmm => "nvmm",
324 AccelType::Whpx => "whpx",
325 AccelType::Mshv => "mshv",
326 AccelType::Tcg => "tcg",
327 }
328 }
329}
330
331impl FromStr for AccelType {
332 type Err = ();
333
334 fn from_str(s: &str) -> Result<Self, Self::Err> {
335 match s {
336 "kvm" => Ok(AccelType::Kvm),
337 "xen" => Ok(AccelType::Xen),
338 "hvf" => Ok(AccelType::Hvf),
339 "nitro" => Ok(AccelType::Nitro),
340 "nvmm" => Ok(AccelType::Nvmm),
341 "whpx" => Ok(AccelType::Whpx),
342 "mshv" => Ok(AccelType::Mshv),
343 "tcg" => Ok(AccelType::Tcg),
344 _ => Err(()),
345 }
346 }
347}
348
349#[derive(Debug, Clone, Hash, Ord, PartialOrd, Eq, PartialEq, Arbitrary)]
350pub enum IgnoreUnmap {
352 Ignore,
354 Unmap,
356}
357
358impl Display for IgnoreUnmap {
359 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
360 match self {
361 IgnoreUnmap::Ignore => write!(f, "ignore"),
362 IgnoreUnmap::Unmap => write!(f, "unmap"),
363 }
364 }
365}
366impl FromStr for IgnoreUnmap {
367 type Err = ();
368
369 fn from_str(s: &str) -> Result<Self, Self::Err> {
370 match s {
371 "ignore" => Ok(IgnoreUnmap::Ignore),
372 "unmap" => Ok(IgnoreUnmap::Unmap),
373 _ => Err(()),
374 }
375 }
376}
377impl ToArg for IgnoreUnmap {
378 fn to_arg(&self) -> &str {
379 match self {
380 IgnoreUnmap::Ignore => "ignore",
381 IgnoreUnmap::Unmap => "unmap",
382 }
383 }
384}
385
386#[derive(Debug, Clone, Hash, Ord, PartialOrd, Eq, PartialEq, Arbitrary)]
387pub enum OnOffUnmap {
389 On,
391 Off,
393 Unmap,
395}
396
397impl Display for OnOffUnmap {
398 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
399 match self {
400 OnOffUnmap::On => write!(f, "on"),
401 OnOffUnmap::Off => write!(f, "off"),
402 OnOffUnmap::Unmap => write!(f, "unmap"),
403 }
404 }
405}
406
407impl FromStr for OnOffUnmap {
408 type Err = ();
409
410 fn from_str(s: &str) -> Result<Self, Self::Err> {
411 match s {
412 "on" => Ok(OnOffUnmap::On),
413 "off" => Ok(OnOffUnmap::Off),
414 "unmap" => Ok(OnOffUnmap::Unmap),
415 _ => Err(()),
416 }
417 }
418}
419impl ToArg for OnOffUnmap {
420 fn to_arg(&self) -> &str {
421 match self {
422 OnOffUnmap::On => "on",
423 OnOffUnmap::Off => "off",
424 OnOffUnmap::Unmap => "unmap",
425 }
426 }
427}
428
429#[derive(Debug, Clone, Hash, Ord, PartialOrd, Eq, PartialEq, Arbitrary)]
430pub enum AutoNeverAlways {
432 Auto,
434 Never,
436 Always,
438}
439
440impl ToArg for AutoNeverAlways {
441 fn to_arg(&self) -> &str {
442 match self {
443 AutoNeverAlways::Auto => "auto",
444 AutoNeverAlways::Never => "never",
445 AutoNeverAlways::Always => "always",
446 }
447 }
448}