1 个不稳定版本
0.1.0 | 2020 年 3 月 30 日 |
---|
#692 在 命令行界面
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 工具提供使用说明(您需要自己编写),它不会验证参数(您需要自己验证),也不会收集参数或将它们放入结构体中。
-
处理
OsString
或String
,由用户选择。如果您想要的话,这个库将正确保留无效的 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>
。