valida_vm_api_linux_x86/
optional_arg.rs

1use std::path::PathBuf;
2
3pub(super) trait OptionalArg {
4    fn cmdline(&self) -> Vec<String>;
5}
6
7pub struct InitialFp(pub u32);
8
9impl OptionalArg for InitialFp {
10    fn cmdline(&self) -> Vec<String> {
11        ["--initial_fp".to_string(), self.0.to_string()].to_vec()
12    }
13}
14
15pub struct ProvingKey(pub PathBuf);
16
17impl OptionalArg for ProvingKey {
18    fn cmdline(&self) -> Vec<String> {
19        [
20            "--proving-key".to_string(),
21            self.0.to_str().unwrap().to_string(),
22        ]
23        .to_vec()
24    }
25}
26
27pub struct VerifyingKey(pub PathBuf);
28
29impl OptionalArg for VerifyingKey {
30    fn cmdline(&self) -> Vec<String> {
31        [
32            "--verifying-key".to_string(),
33            self.0.to_str().unwrap().to_string(),
34        ]
35        .to_vec()
36    }
37}
38
39pub(super) struct FastMode(pub(super) bool);
40
41impl OptionalArg for FastMode {
42    fn cmdline(&self) -> Vec<String> {
43        if self.0 {
44            ["--fast".to_string()].to_vec()
45        } else {
46            Vec::new()
47        }
48    }
49}
50
51impl Default for FastMode {
52    fn default() -> Self {
53        Self(true)
54    }
55}
56
57pub(super) fn prepare_args(args: &[Option<&dyn OptionalArg>]) -> Vec<String> {
58    args.iter()
59        .filter_map(|opt_arg| opt_arg.map(OptionalArg::cmdline))
60        .flatten()
61        .collect()
62}
63
64pub(super) fn as_dyn_arg<T: OptionalArg>(arg: &Option<T>) -> Option<&dyn OptionalArg> {
65    arg.as_ref().map(|t| t as &dyn OptionalArg)
66}
67
68#[test]
69fn test_optional_arguments() {
70    let fast_mode = FastMode(true);
71    let proving_key = ProvingKey(PathBuf::from("keys/proving.key"));
72    let verifying_key = VerifyingKey(PathBuf::from("keys/verifying.key"));
73    let initial_fp = InitialFp(2222);
74
75    let args = prepare_args(&[
76        as_dyn_arg(&Some(fast_mode)),
77        as_dyn_arg(&Some(proving_key)),
78        as_dyn_arg(&Some(verifying_key)),
79        as_dyn_arg(&Some(initial_fp)),
80    ]);
81
82    assert_eq!(
83        args.as_slice(),
84        &[
85            "--fast",
86            "--proving-key",
87            "keys/proving.key",
88            "--verifying-key",
89            "keys/verifying.key",
90            "--initial_fp",
91            "2222",
92        ]
93    )
94}