7 个不稳定版本
0.4.1 | 2023年1月4日 |
---|---|
0.4.0 | 2022年12月31日 |
0.3.1 | 2021年8月25日 |
0.3.0 | 2020年5月6日 |
0.1.1 | 2019年10月17日 |
#802 在 命令行界面 中
113 每月下载量
用于 2 crates
18KB
256 行
arg
非常简单的命令行参数解析代码生成器。
无依赖。
功能
std
- 启用需要std
库的实用工具。
调试
将环境变量 ARG_RS_PRINT_PARSER
设置为除 0
或 false
之外的任何值,以打印解析结果
lib.rs
:
Arg 是一个简单的命令行参数解析器,无任何依赖
功能
std
- 启用需要std
库的实用工具。
语法
字段
Arg
short
- 指定带有短切换的标志。可选地可以提供标志。long
- 指定带有长切换的标志。可选地可以提供标志。default_value
- 指定要使用的默认值。可以作为字符串提供初始化表达式。否则使用 Default 特性。required
- 指定参数是否必需。默认情况下所有参数都是可选的。但布尔值不能标记为required
sub
- 指定字段为子命令。只有一个子命令,它与收集其余参数的Vec<_>
参数互斥。所有其他选项不应用于sub
类型的字段。
类型
- 标志 - 是
bool
开关,当bool
是参数类型时自动选择。每次提供标志都会导致!previous_state
- 选项 - 接受值的开关。用于任何非 Vec 类型。自动覆盖。
- 多选项 - 具有类型
Vec<T>
的开关,允许累积多个开关的值。 - 参数 - 普通参数,接受值。
- 多参数 - 参数集合,累积到
Vec<T>
中,只能有一个。 - 子命令 - 将剩余参数传播到另一个解析器,只能有一个。
转换
默认情况下,所有类型(除了 bool
标志)都使用 FromStr::from_str
从字符串解析值。
可选
如果类型是 Option<T>
,则假设参数是可选的,在这种情况下,不能使用 required
或 default_value
标记。
因此,不提供参数不会使解析器失败。
子命令
它依赖于枚举来表示子命令。
注意,当使用子命令时,就不再可能将多个参数收集到数组中,这会导致编译错误。
子命令消耗所有剩余的参数,因此必须在子命令调用之前传递顶级命令标志/选项。
use arg::Args;
#[derive(Args, Debug)]
///First
struct First {
#[arg(short, long)]
///About this flag
flag: bool,
#[arg(short = "v", long = "velocity", default_value = "42")]
///This is felocity. Default value is 42.
speed: u32,
}
#[derive(Args, Debug)]
///Second
struct Second {
#[arg(short = "v", long = "velocity", default_value = "42")]
///This is velocity. Default value is 42.
speed: u32,
///To store rest of paths
paths: Vec<String>,
}
#[derive(Args, Debug)]
///My subcommand with implicit command 'help` to list commands
enum MySubCommand {
///my first command
First(First),
///my second command
Second(Second),
}
#[derive(Args, Debug)]
struct MyArgs {
#[arg(short, long)]
///About this flag
verbose: bool,
#[arg(sub)]
///My sub command. Use `help` to show list of commands.
cmd: MySubCommand
}
用法
以下是一个综合示例,说明处理标志和选项的所有方法
use arg::Args;
#[derive(Args, Debug)]
///my_exe 0.1.0
///About my program
///
///About my program
struct MyArgs {
#[arg(short, long)]
///About this flag
flag: bool,
#[arg(long = "verbose")]
///Verbose mode
verbose: Option<bool>,
#[arg(short = "v", long = "velocity", default_value = "42")]
///This is velocity. Default value is 42.
speed: u32,
#[arg(short = "g", long = "gps")]
///GPS coordinates.
gps: Vec<u32>,
///To store path
path: String,
///To store path 2
path2: String,
///To store rest of paths as multi argument collector
remain_paths: Vec<String>,
}
fn main() {
match MyArgs::from_text("-v path1 path2") {
Ok(args) => println!("args={:?}", args),
Err(err) => println!("err={:?}", err),
}
}
依赖关系
~2MB
~37K SLoC