#arguments-parser #command-line-arguments #argument #command #arg #cli

args

一个用于简化参数解析和验证的库,旨在减少对通用 'getopts' crate 的繁琐操作。

9 个稳定版本

使用旧的 Rust 2015

2.2.0 2018年2月27日
2.1.0 2017年4月16日
2.0.4 2016年7月13日
2.0.2 2016年4月6日
0.1.1 2016年3月13日

命令行界面 中排名第 249

Download history 181/week @ 2024-03-13 207/week @ 2024-03-20 223/week @ 2024-03-27 285/week @ 2024-04-03 249/week @ 2024-04-10 273/week @ 2024-04-17 170/week @ 2024-04-24 268/week @ 2024-05-01 165/week @ 2024-05-08 182/week @ 2024-05-15 143/week @ 2024-05-22 181/week @ 2024-05-29 154/week @ 2024-06-05 191/week @ 2024-06-12 148/week @ 2024-06-19 103/week @ 2024-06-26

628 次每月下载
6 个 crate 中使用(直接使用 5 个)

MIT 许可证

59KB
1K SLoC

args

基于 getopts crate 的简单命令行参数解析和验证实现。

要使用 args crate,只需创建一个 Args 对象,并通过 flag(...)option(...) 方法开始注册可能的命令行选项。一旦注册了所有选项,就可以直接从命令行解析参数,或者提供一个自己的参数向量。

解析过程中遇到的任何错误都将被封装在 ArgsError 中返回。如果解析过程中没有错误,可以通过调用 value_of(...)validated_value_of(...)args 对象中检索值。

就这么多!

用法

此 crate 在 crates.io 上,可以通过将 args 添加到项目 Cargo.toml 中的依赖项来使用。

[dependencies]
args = "2.0"

并在 crate 根目录中添加以下内容

extern crate args;

示例

以下示例展示了为需要指定零(0)到十(10)之间的迭代次数的应用程序进行简单命令行解析,接受可选的日志文件名并响应用户帮助标志。

extern crate args;
extern crate getopts;

use getopts::Occur;
use std::process::exit;

use args::{Args,ArgsError};
use args::validations::{Order,OrderValidation};

const PROGRAM_DESC: &'static str = "Run this program";
const PROGRAM_NAME: &'static str = "program";

fn main() {
    match parse(&vec!("-i", "5")) {
        Ok(_) => println!("Successfully parsed args"),
        Err(error) => {
            println!("{}", error);
            exit(1);
        }
    };
}

fn parse(input: &Vec<&str>) -> Result<(), ArgsError> {
    let mut args = Args::new(PROGRAM_NAME, PROGRAM_DESC);
    args.flag("h", "help", "Print the usage menu");
    args.option("i",
        "iter",
        "The number of times to run this program",
        "TIMES",
        Occur::Req,
        None);
    args.option("l",
        "log_file",
        "The name of the log file",
        "NAME",
        Occur::Optional,
        Some(String::from("output.log")));

    try!(args.parse(input));

    let help = try!(args.value_of("help"));
    if help {
        args.full_usage();
        return Ok(());
    }

    let gt_0 = Box::new(OrderValidation::new(Order::GreaterThan, 0u32));
    let lt_10 = Box::new(OrderValidation::new(Order::LessThanOrEqual, 10u32));

    let iters = try!(args.validated_value_of("iter", &[gt_0, lt_10]));
    for iter in 0..iters {
        println!("Working on iteration {}", iter);
    }

    let optional_val = try!(Self::optional_value_of::<String>(&args, SERVICE));
    if let Some(val) = optional_val {
        // val is `Some`
    } else {
        // val is `None`
    }

    println!("All done.");

    Ok(())
}

依赖项

~530KB