Skip to main content

qemu_command_builder/
common.rs

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)]
9/// A QEMU boolean-like value encoded as `"yes"` or `"no"`.
10pub enum YesNo {
11    /// Emits `"yes"`.
12    Yes,
13    /// Emits `"no"`.
14    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)]
62/// A QEMU boolean-like value encoded as `"on"` or `"off"`.
63pub enum OnOff {
64    /// Emits `"on"`.
65    On,
66    /// Emits `"off"`.
67    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)]
116/// A QEMU tri-state value encoded as `"on"`, `"off"`, or `"auto"`.
117///
118/// The default is [`OnOffAuto::Auto`].
119pub enum OnOffAuto {
120    /// Emits `"on"`.
121    On,
122    /// Emits `"off"`.
123    Off,
124    /// Emits `"auto"`.
125    #[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)]
180/// A QEMU on/off value whose Rust default is `"on"`.
181///
182/// The default is [`OnOffDefaultOn::On`].
183pub enum OnOffDefaultOn {
184    /// Emits `"on"`.
185    #[default]
186    On,
187    /// Emits `"off"`.
188    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)]
236/// A QEMU on/off value whose Rust default is `"off"`.
237///
238/// The default is [`OnOffDefaultOff::Off`].
239pub enum OnOffDefaultOff {
240    /// Emits `"on"`.
241    On,
242    /// Emits `"off"`.
243    #[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)]
293/// Supported QEMU accelerator backends.
294///
295/// The default is [`AccelType::Tcg`].
296pub enum AccelType {
297    /// Kernel-based Virtual Machine acceleration.
298    Kvm,
299    /// Xen acceleration.
300    Xen,
301    /// Hypervisor.framework acceleration.
302    Hvf,
303    /// NetBSD NVMM acceleration.
304    Nvmm,
305    /// Windows Hypervisor Platform acceleration.
306    Whpx,
307    /// Tiny Code Generator emulation.
308    #[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)]
342/// A QEMU setting encoded as `"ignore"` or `"unmap"`.
343pub enum IgnoreUnmap {
344    /// Emits `"ignore"`.
345    Ignore,
346    /// Emits `"unmap"`.
347    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)]
379/// A QEMU value encoded as `"on"`, `"off"`, or `"unmap"`.
380pub enum OnOffUnmap {
381    /// Emits `"on"`.
382    On,
383    /// Emits `"off"`.
384    Off,
385    /// Emits `"unmap"`.
386    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)]
422/// A QEMU policy value encoded as `"auto"`, `"never"`, or `"always"`.
423pub enum AutoNeverAlways {
424    /// Emits `"auto"`.
425    Auto,
426    /// Emits `"never"`.
427    Never,
428    /// Emits `"always"`.
429    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}