我正在用 Rust 构建一个 CLI 实用程序。为简单起见,假设它执行作为命令行参数给出的任务。用户还可以通过参数选择性地指定谁请求了任务(例如“工程”或“人力资源”)和任务的优先级(“高”或“低”)。
我希望程序能够识别仅从值中指定的参数,即没有命令行标志。(参数的可能值不重叠。)例如,这些都应该有效:
app task1 HR
app task2 high
app task3 low Engineering
app task4 high HR
当然,我可以为此编写自定义逻辑,但我的问题是:我可以使用 crate 来解析命令行参数,例如clap吗?
Fwiw,我尝试使用 clap 中的ArgGroup
结构来获得这种行为,但没有成功。所以:
use clap::{App,Arg,ArgGroup};
fn main() {
let m = App::new("app")
.arg(Arg::with_name("task_name")
.required(true))
.arg(Arg::with_name("requested_by")
.possible_values(&["HR","Engineering"])
.required(false))
.arg(Arg::with_name("priority")
.possible_values(&["high","low"])
.required(false))
.group(ArgGroup::with_name("options")
.arg("requested_by")
.arg("priority")
.multiple(true))
.get_matches_from(vec!["app", "task1","high"]);
}
这坚持将“高”解析为 a requested_by
,而不是 a priority
,因此它给出:
错误:“高”不是“<requested_by>”的有效值 [可能的值:工程、人力资源]
用法:应用程序 <task_name> <requested_by|priority>
有关更多信息,请尝试 --help