qemu_command_builder/
cpu.rs

1use std::ops::Add;
2
3use bon::Builder;
4
5use crate::ToCommand;
6use crate::cpu_flags::CPUFlags;
7use crate::cpu_type::CpuTypeX86_64;
8
9#[derive(Builder)]
10pub struct CpuX86 {
11    cpu_type: CpuTypeX86_64,
12    migratable: Option<bool>,
13    flags: Vec<CPUFlags>,
14}
15
16impl CpuX86 {
17    pub fn new(cpu_type: CpuTypeX86_64) -> Self {
18        CpuX86 {
19            cpu_type,
20            migratable: None,
21            flags: vec![],
22        }
23    }
24
25    pub fn migratable(&mut self, state: bool) -> &mut Self {
26        self.migratable = Some(state);
27        self
28    }
29    pub fn flags(&mut self, flags: Vec<CPUFlags>) -> &mut Self {
30        self.flags = flags;
31        self
32    }
33}
34
35impl ToCommand for CpuX86 {
36    fn to_command(&self) -> Vec<String> {
37        let mut cmd = vec!["-cpu".to_string()];
38        let mut ct = self.cpu_type.to_command().join("");
39
40        if let Some(migratable) = self.migratable
41            && migratable {
42                ct.push_str(",migratable=yes");
43            }
44        let flags: Vec<String> = self
45            .flags
46            .iter()
47            .map(|v| v.to_command())
48            .collect::<Vec<Vec<String>>>()
49            .concat();
50        if !flags.is_empty() {
51            let flags: Vec<String> = flags.iter().map(|flag| "-".to_string().add(flag)).collect();
52            ct.push_str(format!(",{}", flags.join(",")).as_str());
53        }
54
55        cmd.push(ct);
56
57        cmd
58    }
59}