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 Nvmm,
305 Whpx,
307 #[default]
309 Tcg,
310}
311
312impl ToArg for AccelType {
313 fn to_arg(&self) -> &str {
314 match self {
315 AccelType::Kvm => "kvm",
316 AccelType::Xen => "xen",
317 AccelType::Hvf => "hvf",
318 AccelType::Nvmm => "nvmm",
319 AccelType::Whpx => "whpx",
320 AccelType::Tcg => "tcg",
321 }
322 }
323}
324
325impl FromStr for AccelType {
326 type Err = ();
327
328 fn from_str(s: &str) -> Result<Self, Self::Err> {
329 match s {
330 "kvm" => Ok(AccelType::Kvm),
331 "xen" => Ok(AccelType::Xen),
332 "hvf" => Ok(AccelType::Hvf),
333 "nvmm" => Ok(AccelType::Nvmm),
334 "whpx" => Ok(AccelType::Whpx),
335 "tcg" => Ok(AccelType::Tcg),
336 _ => Err(()),
337 }
338 }
339}
340
341#[derive(Debug, Clone, Hash, Ord, PartialOrd, Eq, PartialEq, Arbitrary)]
342pub enum IgnoreUnmap {
344 Ignore,
346 Unmap,
348}
349
350impl Display for IgnoreUnmap {
351 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
352 match self {
353 IgnoreUnmap::Ignore => write!(f, "ignore"),
354 IgnoreUnmap::Unmap => write!(f, "unmap"),
355 }
356 }
357}
358impl FromStr for IgnoreUnmap {
359 type Err = ();
360
361 fn from_str(s: &str) -> Result<Self, Self::Err> {
362 match s {
363 "ignore" => Ok(IgnoreUnmap::Ignore),
364 "unmap" => Ok(IgnoreUnmap::Unmap),
365 _ => Err(()),
366 }
367 }
368}
369impl ToArg for IgnoreUnmap {
370 fn to_arg(&self) -> &str {
371 match self {
372 IgnoreUnmap::Ignore => "ignore",
373 IgnoreUnmap::Unmap => "unmap",
374 }
375 }
376}
377
378#[derive(Debug, Clone, Hash, Ord, PartialOrd, Eq, PartialEq, Arbitrary)]
379pub enum OnOffUnmap {
381 On,
383 Off,
385 Unmap,
387}
388
389impl Display for OnOffUnmap {
390 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
391 match self {
392 OnOffUnmap::On => write!(f, "on"),
393 OnOffUnmap::Off => write!(f, "off"),
394 OnOffUnmap::Unmap => write!(f, "unmap"),
395 }
396 }
397}
398
399impl FromStr for OnOffUnmap {
400 type Err = ();
401
402 fn from_str(s: &str) -> Result<Self, Self::Err> {
403 match s {
404 "on" => Ok(OnOffUnmap::On),
405 "off" => Ok(OnOffUnmap::Off),
406 "unmap" => Ok(OnOffUnmap::Unmap),
407 _ => Err(()),
408 }
409 }
410}
411impl ToArg for OnOffUnmap {
412 fn to_arg(&self) -> &str {
413 match self {
414 OnOffUnmap::On => "on",
415 OnOffUnmap::Off => "off",
416 OnOffUnmap::Unmap => "unmap",
417 }
418 }
419}
420
421#[derive(Debug, Clone, Hash, Ord, PartialOrd, Eq, PartialEq, Arbitrary)]
422pub enum AutoNeverAlways {
424 Auto,
426 Never,
428 Always,
430}
431
432impl ToArg for AutoNeverAlways {
433 fn to_arg(&self) -> &str {
434 match self {
435 AutoNeverAlways::Auto => "auto",
436 AutoNeverAlways::Never => "never",
437 AutoNeverAlways::Always => "always",
438 }
439 }
440}