我想创建一个利用clap来解析输入的命令行。我能想到的最好的办法是一个循环,要求用户输入,用一个regex将其分解,然后建立一个Vec,以某种方式传递给
loop {
// Print command prompt and get command
print!("> "); io::stdout().flush().expect("Couldn't flush stdout");
let mut input = String::new(); // Take user input (to be parsed as clap args)
io::stdin().read_line(&mut input).expect("Error reading input.");
let args = WORD.captures_iter(&input)
.map(|cap| cap.get(1).or(cap.get(2)).unwrap().as_str())
.collect::<Vec<&str>>();
let matches = App::new("MyApp")
// ... Process Clap args/subcommands
.get_matches(args); //match arguments from CLI args variable
}
基本上,我想知道是否有办法引导Clap使用预先给定的参数列表?
正如 @mcarton 所说,命令行程序是以数组的形式传递参数的,而不是以字符串的形式。shell会将原来的命令行进行拆分(考虑到引号、变量扩展等因素)。
如果你的要求很简单,你可以简单地在空格上拆分你的字符串,然后把它传给Clap。或者,如果你想尊重引号字符串,你可以使用 贝壳词 来解析它。
let words = shellwords::split(input)?;
let matches = App::new("MyApp")
// ... command line argument options
.get_matches_from(words);
这就是我最后如何让整个事情运作起来的。
首先,我把我的整个主函数放在一个叫做 loop
这样它就能获取命令,并且,留在CLI中。
接下来,我通过 stdin
分头论证
// Print command prompt and get command
print!("> ");
io::stdout().flush().expect("Couldn't flush stdout");
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Error reading input.");
let args = WORD.captures_iter(&input)
.map(|cap| cap.get(1).or(cap.get(2)).unwrap().as_str())
.collect::<Vec<&str>>();
然后我用Clap来解析,有点像@harmic建议的那样
let matches = App::new("MyApp")
// ... command line argument options
.get_matches_from(words);
并使用 subcommands
而不是 arguments
.
例如:.
.subcommand(SubCommand::with_name("list")
.help("Print namespaces currently tracked in the database."))
整个文件是 此处 对于好奇心强的人来说。