11 个版本
0.1.12 | 2023 年 8 月 8 日 |
---|---|
0.1.10 | 2023 年 1 月 11 日 |
0.1.9 | 2022 年 9 月 22 日 |
0.1.8 | 2022 年 6 月 29 日 |
0.1.1 | 2020 年 1 月 31 日 |
#163 in 命令行界面
234,166 个月下载量
在 328 个 crate(直接使用 2 个) 中使用
13KB
103 行
Argh
Argh 是一个基于派生的、针对代码大小和 Fuchsia 命令行工具规范兼容性优化的参数解析器
基于派生的参数解析,针对代码大小和 Fuchsia 命令行工具规范兼容性优化
此库的公共 API 主要由 FromArgs
派生和 from_env
函数组成,这些函数可以用于从当前程序的命令行参数生成顶级 FromArgs
类型。
基本示例
use argh::FromArgs;
#[derive(FromArgs)]
/// Reach new heights.
struct GoUp {
/// whether or not to jump
#[argh(switch, short = 'j')]
jump: bool,
/// how high to go
#[argh(option)]
height: usize,
/// an optional nickname for the pilot
#[argh(option)]
pilot_nickname: Option<String>,
}
fn main() {
let up: GoUp = argh::from_env();
}
./some_bin --help
将输出以下内容
Usage: cmdname [-j] --height <height> [--pilot-nickname <pilot-nickname>]
Reach new heights.
Options:
-j, --jump whether or not to jump
--height how high to go
--pilot-nickname an optional nickname for the pilot
--help display usage information
生成的程序可以使用以下任何一种方式使用
./some_bin --高度 5
./some_bin -j --高度 5
./some_bin --跳跃 --高度 5 --飞行员昵称Wes
像 jump
这样的开关是可选的,如果提供,则将其设置为 true。
选项,例如height
和pilot_nickname
,可以是必需的、可选的或重复的,这取决于它们是否包含在Option
或Vec
中。可以使用#[argh(default = "<your_code_here>")]
属性提供默认值,在这种情况下,选项被视为可选的。
use argh::FromArgs;
fn default_height() -> usize {
5
}
#[derive(FromArgs)]
/// Reach new heights.
struct GoUp {
/// an optional nickname for the pilot
#[argh(option)]
pilot_nickname: Option<String>,
/// an optional height
#[argh(option, default = "default_height()")]
height: usize,
/// an optional direction which is "up" by default
#[argh(option, default = "String::from(\"only up\")")]
direction: String,
}
fn main() {
let up: GoUp = argh::from_env();
}
只要自定义选项类型实现了FromArgValue
特质(对于所有FromStr
类型自动实现),就可以反序列化自定义选项类型。如果需要更定制化的解析,可以使用from_str_fn
属性提供自定义的fn(&str) -> Result<T, String>
。
use argh::FromArgs;
#[derive(FromArgs)]
/// Goofy thing.
struct FiveStruct {
/// always five
#[argh(option, from_str_fn(always_five))]
five: usize,
}
fn always_five(_value: &str) -> Result<usize, String> {
Ok(5)
}
可以使用#[argh(positional)]
声明位置参数。这些参数将按照结构中声明的顺序进行解析。
use argh::FromArgs;
#[derive(FromArgs, PartialEq, Debug)]
/// A command with positional arguments.
struct WithPositional {
#[argh(positional)]
first: String,
}
最后一个位置参数可以包含默认值,或用Option
或Vec
包裹,以表示可选或重复的位置参数。
也支持子命令。要使用子命令,需要为每个子命令声明一个单独的FromArgs
类型,以及一个覆盖每个命令的枚举。
use argh::FromArgs;
#[derive(FromArgs, PartialEq, Debug)]
/// Top-level command.
struct TopLevel {
#[argh(subcommand)]
nested: MySubCommandEnum,
}
#[derive(FromArgs, PartialEq, Debug)]
#[argh(subcommand)]
enum MySubCommandEnum {
One(SubCommandOne),
Two(SubCommandTwo),
}
#[derive(FromArgs, PartialEq, Debug)]
/// First subcommand.
#[argh(subcommand, name = "one")]
struct SubCommandOne {
#[argh(option)]
/// how many x
x: usize,
}
#[derive(FromArgs, PartialEq, Debug)]
/// Second subcommand.
#[argh(subcommand, name = "two")]
struct SubCommandTwo {
#[argh(switch)]
/// whether to fooey
fooey: bool,
}
注意:这不是一个官方支持的产品。
如何调试argh
的展开derive宏
可以使用cargo-expand crate调试argh::FromArgs
derive宏。
在examples/simple_example.rs
中展开derive宏
请参阅argh/examples/simple_example.rs以获取我们希望展开的示例结构。
首先,通过运行cargo install cargo-expand
安装cargo-expand
。请注意,这需要Rust的nightly版本。
安装完成后,在argh
包中运行cargo expand
,您可以看到展开后的代码。
依赖关系
~0.4–1MB
~23K SLoC