qemu_command_builder/
icount.rs

1use std::path::PathBuf;
2
3use bon::Builder;
4
5use crate::common::OnOff;
6use crate::to_command::{ToArg, ToCommand};
7
8pub enum Shift {
9    N(usize),
10    Auto,
11}
12
13pub enum RecordReplay {
14    Record,
15    Replay,
16}
17
18impl ToArg for RecordReplay {
19    fn to_arg(&self) -> &str {
20        match self {
21            RecordReplay::Record => "record",
22            RecordReplay::Replay => "replay",
23        }
24    }
25}
26#[derive(Builder)]
27pub struct Icount {
28    shift: Option<Shift>,
29    align: Option<OnOff>,
30    sleep: Option<OnOff>,
31    rr: Option<RecordReplay>,
32    rrfile: Option<PathBuf>,
33    rrsnapshot: Option<String>,
34}
35
36impl ToCommand for Icount {
37    fn to_command(&self) -> Vec<String> {
38        let mut cmd = vec![];
39
40        cmd.push("-icount".to_string());
41
42        let mut args = vec![];
43
44        if let Some(shift) = &self.shift {
45            match shift {
46                Shift::N(size) => {
47                    args.push(format!("shift={}", size));
48                }
49                Shift::Auto => {
50                    args.push("shift=auto".to_string());
51                }
52            }
53        }
54        if let Some(align) = &self.align {
55            args.push(format!("align={}", align.to_arg()));
56        }
57        if let Some(sleep) = &self.sleep {
58            args.push(format!("sleep={}", sleep.to_arg()));
59        }
60        if let Some(rr) = &self.rr {
61            args.push(format!("rr={}", rr.to_arg()));
62        }
63        if let Some(rrfile) = &self.rrfile {
64            args.push(format!("rrfile={}", rrfile.display()));
65        }
66        if let Some(rrsnapshot) = &self.rrsnapshot {
67            args.push(format!("rrsnapshot={}", rrsnapshot));
68        }
69        cmd.push(args.join(","));
70        cmd
71    }
72}