1 个不稳定版本

0.1.0 2020 年 3 月 30 日

#692命令行界面

MIT 许可证

29KB
550

SimpleArgs:Rust 的简单命令行参数解析

这是一个用于在 Rust 中解析命令行参数的简单、小巧的库。

您编写自己的解析器,遍历参数。SimpleArgs 解释原始参数并提供高质量的错误消息。

示例

use simpleargs::{Arg, Args, UsageError, OptionError};
use std::ffi::OsString;
use std::str::FromStr;

fn parse_args<T>(mut args: Args<T>) -> Result<(), UsageError<OsString>>
where
    T: Iterator<Item = OsString>,
{
    // The input file
    let mut input: Option<OsString> = None;
    // True if -flag was set
    let mut flag = false;
    // The value of -xvalue, if it was used
    let mut xvalue: Option<i32> = None;
    loop {
        match args.next() {
            Arg::Positional(arg) => if input.is_some() {
                return Err(UsageError::UnexpectedArgument { arg });
            } else {
                input = Some(arg)
            }
            Arg::Named(arg) => arg.parse(|name, value| match name {
                "flag" => {
                    // parse() above will return an error for -flag=value,
                    // because this function does not use 'value'.
                    flag = true;
                    Ok(())
                }
                "xvalue" => {
                    // Call as_str() for a str, or as_osstr() for OsStr.
                    xvalue = Some(i32::from_str(value.as_str()?)?);
                    Ok(())
                }
                _ => Err(OptionError::Unknown),
            })?,
            Arg::End => break,
            Arg::Error(err) => return Err(err),
        }
    }
    let input = match input {
        Some(path) => path,
        None => return Err(UsageError::MissingArgument { name: "input".to_owned() }),
    };
    Ok(())
}

目标和非目标

  • 简单的参数解析,仅此而已。这个库不会为您的 CLI 工具提供使用说明(您需要自己编写),它不会验证参数(您需要自己验证),也不会收集参数或将它们放入结构体中。

  • 处理 OsStringString,由用户选择。如果您想要的话,这个库将正确保留无效的 Unicode 数据。您可以执行一些病理性的操作,例如将 -flag=$'\xff' 传递给您的命令行工具。但是,如果您不希望这样,您只需使用字符串方法即可。

  • 不错的错误消息。

    $ my-tool -namee=abc
    Error: unknown option -namee
    $ my-tool -name=$'\xff'
    Error: invalid value "\xff" for -name: invalid Unicode string
    $ my-tool -count=1q
    Error: invalid value "0q" for option -count: invalid digit found in string
    

限制

我们打算修复的已知限制

  • 目前尚未支持 Windows!OsString 在 Windows 上的行为与在其他系统上不同。不,我们无法编写同时适用于 Windows 和非 Windows 系统的通用代码。

观点

作为库设计接受的已知限制

  • 您不想组合短选项。您可以有三个单独的选项 -a-b-c,但不能将这三个选项组合成 -abc。将短标志组合到一个参数中仅对最常用的交互式工具(如 ls)有用。

  • -option--option 之间没有区别。一个或两个短横线被同等对待。

  • -- 之后的所有选项都被视为位置参数。

  • 选项无法接受多个参数。如果您想使用类似 -pos <x> <y> 的格式,您必须写成 -pos <x>,<y>

比较

  • Clap 功能强大,拥有众多特性。它允许您以几种不同的方式定义每个参数的解析或存储方式。SimpleArgs 是针对喜欢更简洁、明确方法的用户。

  • Docopt 是面向那些希望先编写文档,然后由库根据文档生成解析器的用户。SimpleArgs 是面向那些希望单独编写解析器的用户。

  • StructOpt 实际上是 Clap 的一种变体。

  • getopts 要简单和有限制一些。

  • Seahorse 是一个完整的命令行工具框架。

无运行时依赖