#命令行 #命令行参数 #实用程序 #帮助 #程序 #选项

程序+库 libcli

一组实用程序,用于帮助开发基于命令行的程序

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 #选项

Download history 2/week @ 2024-03-10 35/week @ 2024-03-31 1/week @ 2024-04-07

每月 55 次下载
用于 rswatch

MIT 许可证

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,这对于覆盖如 helpversion 这样的选项很有用

这使得我们可以在缺少必需选项的情况下提供帮助选项而不会解析失败

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应用程序中,将其打印到控制台以外的其他地方。

这也可以用于版本或其他类似情况。

无运行时依赖。