valida_vm_api_linux_x86/
optional_arg.rs1use 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}