qemu_command_builder/
icount.rs1use 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}