qemu_command_builder/args/
overcommit.rs1use crate::common::OnOff;
2use crate::parsers::ARG_OVERCOMMIT;
3use crate::to_command::{ToArg, ToCommand};
4use proptest_derive::Arbitrary;
5use std::str::FromStr;
6
7#[derive(Debug, Clone, Hash, Ord, PartialOrd, Eq, PartialEq, Arbitrary)]
9pub enum OnOffOnfault {
10 On,
11 Off,
12 Onfault,
13}
14
15impl ToArg for OnOffOnfault {
16 fn to_arg(&self) -> &str {
17 match self {
18 OnOffOnfault::On => "on",
19 OnOffOnfault::Off => "off",
20 OnOffOnfault::Onfault => "on-fault",
21 }
22 }
23}
24
25#[derive(Debug, Clone, Hash, Ord, PartialOrd, Eq, PartialEq, Arbitrary)]
27pub enum Overcommit {
28 MemLock(OnOffOnfault),
29 CpuPm(OnOff),
30}
31
32impl ToCommand for Overcommit {
33 fn command(&self) -> String {
34 ARG_OVERCOMMIT.to_string()
35 }
36 fn to_args(&self) -> Vec<String> {
37 let mut args = vec![];
38
39 match self {
40 Overcommit::MemLock(memlock) => {
41 args.push(format!("mem-lock={}", memlock.to_arg()));
42 }
43 Overcommit::CpuPm(cpupm) => {
44 args.push(format!("cpu-pm={}", cpupm.to_arg()));
45 }
46 }
47
48 args
49 }
50}
51
52impl FromStr for Overcommit {
53 type Err = String;
54
55 fn from_str(s: &str) -> Result<Self, Self::Err> {
56 let (key, value) = s.split_once('=').ok_or_else(|| format!("invalid -overcommit argument: {s}"))?;
57 match key {
58 "mem-lock" => match value {
59 "on" => Ok(Self::MemLock(OnOffOnfault::On)),
60 "off" => Ok(Self::MemLock(OnOffOnfault::Off)),
61 "on-fault" => Ok(Self::MemLock(OnOffOnfault::Onfault)),
62 _ => Err(format!("invalid mem-lock value: {value}")),
63 },
64 "cpu-pm" => Ok(Self::CpuPm(value.parse::<OnOff>().map_err(|_| format!("invalid cpu-pm value: {value}"))?)),
65 other => Err(format!("unsupported -overcommit option: {other}")),
66 }
67 }
68}