1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// ---------------- [ File: bitcoin-argsman/src/set.rs ]
crate::ix!();
impl ArgsManagerInner {
/**
| Set an argument if it doesn't already
| have a value
|
| -----------
| @param strArg
|
| Argument to set (e.g. "-foo")
| ----------
| @param strValue
|
| Value (e.g. "1")
|
| -----------
| @return
|
| true if argument gets set, false if it
| already had a value
|
*/
pub fn soft_set_arg(&mut self,
str_arg: &str,
str_value: &str) -> bool {
if self.is_arg_set(str_arg) {
return false;
}
self.force_set_arg(str_arg, str_value);
true
}
/**
| Forces an arg setting. Called by
|
| SoftSetArg() if the arg hasn't already
| been set. Also called directly in testing.
|
*/
pub fn force_set_arg(&mut self, str_arg: &str, str_value: &str) {
let key = setting_name(str_arg);
let uni = match str_value {
"0" => UniValue::from(false),
"1" => UniValue::from(true),
_ => UniValue::from(str_value),
};
let val = SettingsValue(uni);
// Keep forced map
self.settings
.forced_settings_mut()
.insert(key.clone(), val.clone());
// Mirror into CLI options so local resolver sees it
self.settings
.command_line_options_mut()
.entry(key)
.or_insert_with(Vec::new)
.push(val);
}
/**
| Set a boolean argument if it doesn't
| already have a value
|
| -----------
| @param strArg
|
| Argument to set (e.g. "-foo")
| ----------
| @param fValue
|
| Value (e.g. false)
|
| -----------
| @return
|
| true if argument gets set, false if it
| already had a value
|
*/
pub fn soft_set_bool_arg(&mut self,
str_arg: &str,
value: bool) -> bool {
if value {
self.soft_set_arg(str_arg,&"1".to_string())
} else {
self.soft_set_arg(str_arg,&"0".to_string())
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn soft_set_and_force_set_behavior() {
let mut inner = ArgsManagerInner::default();
// soft set when not set
assert!(inner.soft_set_arg("-foo", "1"));
assert_eq!(inner.get_arg("-foo", "0"), "1");
// soft set should not override
assert!(!inner.soft_set_arg("-foo", "2"));
assert_eq!(inner.get_arg("-foo", "0"), "1");
// force set always overrides
inner.force_set_arg("-foo", "3");
assert_eq!(inner.get_arg("-foo", "0"), "3");
// boolean soft-set
let _ = inner.soft_set_bool_arg("-bar", true);
assert_eq!(inner.get_arg("-bar", "0"), "1");
let _ = inner.soft_set_bool_arg("-bar", false); // won't override
assert_eq!(inner.get_arg("-bar", "0"), "1");
}
}