12 个版本
0.3.9 | 2020 年 8 月 11 日 |
---|---|
0.3.8 | 2020 年 8 月 11 日 |
0.3.7 | 2020 年 6 月 27 日 |
0.2.4 | 2020 年 6 月 25 日 |
0.1.3 | 2020 年 6 月 25 日 |
#44 in #选项
每月 55 次下载
用于 rswatch
21KB
327 行
libcli
一个 Rust 库,包含用于开发基于命令行的程序的实用程序
更多功能即将推出
解析命令行参数
模块 config
包含了解析命令行参数的功能
允许您提供一个 OptionSpec 列表,该列表指定
- 选项的名称
- 可以组合的缩写单字母名称,例如 -rv
- 描述,可以用于生成使用信息
- 必需或非必需选项
- 接受的值的数量,指定确切的数量、至少和最多数量
从 std::env::args 或自定义列表解析参数
在创建 OptionSpec 列表后,将它们传递给 Config::new 或 Config::new_env
示例
let specs = [
args::OptionSpec::new(
'\0',
"(unnamed)",
"Input files",
true,
args::OptionPolicy::AtLeast(2), // 1st value is program name
),
args::OptionSpec::new(
'o',
"output",
"Searches recursive",
false,
args::OptionPolicy::Exact(1),
),
args::OptionSpec::new(
'v',
"verbose",
"Shows verbose output",
false,
args::OptionPolicy::Exact(0),
),
];
let config = args::Config::new_env(&specs).unwrap_or_else(|err| {
println!("{}", err);
std::process::exit(1);
});
// Check if verbose was specified, either as --verbose or -v
let verbose: bool = match config.option("verbose") {
Some(_) => true,
None => false,
};
// Should always return Some since option was required, new_env should have failed if not included
let files = match config.option("(unnamed)") {
Some(v) => v,
None => panic!("Didn't get input files"),
};
if verbose {
println!("Reading files {:?}...", files);
}
// logic
忽略选项
OptionPolicy 提供了一个名为 Final 的变体调用,它将收集所有剩余的参数到选项的值中,无论是否有更多选项
这可以很有用,如果您希望用户将命令作为最后一个参数输入,并且不希望该命令的参数影响您的程序,例如; myprogram -vo output.txt --exec grep search -.
如果 exec
策略为 Final
,则 -r 选项不会被解析为另一个参数,而是成为 exec
的值
帮助和使用说明
检测帮助选项而不会因缺少必需选项而失败
FinalIgnore
选项策略与 Finalize 作用相同,但不会因缺少必需选项而返回 Err,这对于覆盖如 help
或 version
这样的选项很有用
这使得我们可以在缺少必需选项的情况下提供帮助选项而不会解析失败
args::Config::generate_usage(&specs, list_required, list_unrequired)
生成一个可打印的使用字符串
// Add this OptionSpec with the others with FinalizeIgnore policy
args::OptionSpec::new(
'h',
"help",
"Display a help screen",
false,
args::OptionPolicy::FinalizeIgnore(),
),
正常解析并检查是否包含帮助信息。注意:当使用FinalizeIgnore时,可能返回空值,这通常不会发生,因为解析会返回Err。
let config = args::Config::new_env(&specs).unwrap_or_else(|err| {
println!("{}", err);
std::process::exit(1);
});
if let Some(_) = config.option("help") {
println!(
"Myprogram\n{}",
args::Config::generate_usage(&specs, true, true)
);
return;
}
使用这种风格而不是自动帮助功能进行解析的好处是,您可以为解析器不知道的参数添加额外信息,或者如果是在GUI应用程序中,将其打印到控制台以外的其他地方。
这也可以用于版本或其他类似情况。