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
#![doc(html_root_url = "https://docs.rs/molt/0.1.0")]
pub use crate::interp::Interp;
pub use crate::list::list_to_string;
pub use crate::types::*;
mod commands;
mod eval_ptr;
mod expr;
pub mod interp;
mod list;
pub mod tokenizer;
#[macro_use]
mod macros;
#[allow(dead_code)]
mod parser;
mod scope;
pub mod types;
mod util;
pub mod value;
pub fn check_args(
namec: usize,
argv: &[Value],
min: usize,
max: usize,
argsig: &str,
) -> MoltResult {
assert!(namec >= 1);
assert!(min >= 1);
assert!(!argv.is_empty());
if argv.len() < min || (max > 0 && argv.len() > max) {
let cmd_tokens = Value::from(&argv[0..namec]);
molt_err!(
"wrong # args: should be \"{} {}\"",
cmd_tokens.to_string(),
argsig
)
} else {
molt_ok!()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_check_args() {
assert_ok(&check_args(1, &mklist(vec!["mycmd"].as_slice()), 1, 1, ""));
assert_ok(&check_args(
1,
&mklist(vec!["mycmd"].as_slice()),
1,
2,
"arg1",
));
assert_ok(&check_args(
1,
&mklist(vec!["mycmd", "data"].as_slice()),
1,
2,
"arg1",
));
assert_ok(&check_args(
1,
&mklist(vec!["mycmd", "data", "data2"].as_slice()),
1,
0,
"arg1",
));
assert_err(
&check_args(1, &mklist(vec!["mycmd"].as_slice()), 2, 2, "arg1"),
"wrong # args: should be \"mycmd arg1\"",
);
assert_err(
&check_args(
1,
&mklist(vec!["mycmd", "val1", "val2"].as_slice()),
2,
2,
"arg1",
),
"wrong # args: should be \"mycmd arg1\"",
);
}
fn mklist(argv: &[&str]) -> MoltList {
argv.iter().map(|s| Value::from(*s)).collect()
}
fn assert_err(result: &MoltResult, msg: &str) {
assert_eq!(molt_err!(msg), *result);
}
fn assert_ok(result: &MoltResult) {
assert!(result.is_ok(), "Result is not Ok");
}
}