1 use crate::api
::schema
::*;
10 Argument { value: String }
,
11 Option { name: String, value: Option<String> }
,
14 fn parse_argument(arg
: &str) -> RawArgument
{
16 let chars
: Vec
<char> = arg
.chars().collect();
18 let length
= chars
.len();
26 if length
== 2 { return RawArgument::Separator; }
30 for start
in first
..length
{
31 if chars
[start
] == '
='
{
32 let name
: String
= chars
[first
..start
].iter().collect();
33 let value
: String
= chars
[start
+1..length
].iter().collect();
34 return RawArgument
::Option { name, value: Some(value) }
38 let name
: String
= chars
[first
..].iter().collect();
39 return RawArgument
::Option { name: name, value: None }
43 RawArgument
::Argument { value: arg.to_string() }
46 pub fn parse_arguments(
48 arg_param
: &Vec
<&'
static str>,
49 schema
: &ObjectSchema
,
50 ) -> Result
<(Value
,Vec
<String
>), ParameterError
> {
52 let mut errors
= ParameterError
::new();
54 let properties
= &schema
.properties
;
56 let mut data
: Vec
<(String
, String
)> = vec
![];
57 let mut rest
: Vec
<String
> = vec
![];
63 while pos
< args
.len() {
65 rest
.push(args
[pos
].clone());
67 match parse_argument(&args
[pos
]) {
68 RawArgument
::Separator
=> {
71 RawArgument
::Option { name, value }
=> {
74 let mut want_bool
= false;
75 let mut can_default
= false;
76 if let Some((_optional
, param_schema
)) = properties
.get
::<str>(&name
) {
77 if let Schema
::Boolean(boolean_schema
) = param_schema
.as_ref() {
79 if let Some(default) = boolean_schema
.default {
80 if default == false { can_default = true; }
87 let mut next_is_argument
= false;
88 let mut next_is_bool
= false;
90 if (pos
+ 1) < args
.len() {
91 let next
= &args
[pos
+1];
92 if let RawArgument
::Argument { value: _}
= parse_argument(next
) {
93 next_is_argument
= true;
94 if let Ok(_
) = parse_boolean(next
) { next_is_bool = true; }
101 data
.push((name
, args
[pos
].clone()));
102 } else if can_default
{
103 data
.push((name
, "true".to_string()));
105 errors
.push(format_err
!("parameter '{}': {}", name
,
106 "missing boolean value."));
111 if next_is_argument
{
113 data
.push((name
, args
[pos
].clone()));
115 errors
.push(format_err
!("parameter '{}': {}", name
,
116 "missing parameter value."));
121 data
.push((name
, v
));
125 RawArgument
::Argument { value }
=> {
134 for i
in 0..arg_param
.len() {
136 data
.push((arg_param
[i
].to_string(), rest
[i
].clone()));
138 errors
.push(format_err
!("missing argument '{}'", arg_param
[i
]));
142 if errors
.len() > 0 { return Err(errors); }
144 if arg_param
.len() > 0 {
145 rest
= rest
[arg_param
.len()..].to_vec();
148 let options
= parse_parameter_strings(&data
, schema
, true)?
;
155 fn test_boolean_arg() {
157 let schema
= ObjectSchema
::new("Parameters:")
159 "enable", BooleanSchema
::new("Enable")
162 let mut variants
: Vec
<(Vec
<&str>, bool
)> = vec
![];
163 variants
.push((vec
!["-enable"], true));
164 variants
.push((vec
!["-enable=1"], true));
165 variants
.push((vec
!["-enable", "yes"], true));
166 variants
.push((vec
!["-enable", "Yes"], true));
167 variants
.push((vec
!["--enable", "1"], true));
168 variants
.push((vec
!["--enable", "ON"], true));
169 variants
.push((vec
!["--enable", "true"], true));
171 variants
.push((vec
!["--enable", "0"], false));
172 variants
.push((vec
!["--enable", "no"], false));
173 variants
.push((vec
!["--enable", "off"], false));
174 variants
.push((vec
!["--enable", "false"], false));
176 for (args
, expect
) in variants
{
177 let string_args
= args
.iter().map(|s
| s
.to_string()).collect();
178 let res
= parse_arguments(&string_args
, &vec
![], &schema
);
179 assert
!(res
.is_ok());
180 if let Ok((options
, rest
)) = res
{
181 assert
!(options
["enable"] == expect
);
182 assert
!(rest
.len() == 0);
188 fn test_argument_paramenter() {
190 let schema
= ObjectSchema
::new("Parameters:")
191 .required("enable", BooleanSchema
::new("Enable."))
192 .required("storage", StringSchema
::new("Storage."));
194 let args
= vec
!["-enable", "local"];
195 let string_args
= args
.iter().map(|s
| s
.to_string()).collect();
196 let res
= parse_arguments(&string_args
, &vec
!["storage"], &schema
);
197 assert
!(res
.is_ok());
198 if let Ok((options
, rest
)) = res
{
199 assert
!(options
["enable"] == true);
200 assert
!(options
["storage"] == "local");
201 assert
!(rest
.len() == 0);