Rust: 解析用户输入的字符串,带clap的命令行编程。

问题描述 投票:0回答:1

我想创建一个利用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使用预先给定的参数列表?

rust command-line-interface clap
1个回答
1
投票

正如 @mcarton 所说,命令行程序是以数组的形式传递参数的,而不是以字符串的形式。shell会将原来的命令行进行拆分(考虑到引号、变量扩展等因素)。

如果你的要求很简单,你可以简单地在空格上拆分你的字符串,然后把它传给Clap。或者,如果你想尊重引号字符串,你可以使用 贝壳词 来解析它。

let words = shellwords::split(input)?;
let matches = App::new("MyApp")
    // ... command line argument options
    .get_matches_from(words);

0
投票

这就是我最后如何让整个事情运作起来的。

首先,我把我的整个主函数放在一个叫做 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."))

整个文件是 此处 对于好奇心强的人来说。

© www.soinside.com 2019 - 2024. All rights reserved.