4 个版本
0.1.7 | 2021年7月2日 |
---|---|
0.1.6 | 2021年5月28日 |
0.1.5 | 2021年5月26日 |
0.1.4 | 2021年5月11日 |
#27 在 #args
35KB
451 行
Argh
Argh 是一个基于 derive 的、针对代码大小优化的参数解析器
基于 derive 的参数解析,针对代码大小和符合 Fuchsia 命令行工具规范进行了优化
该库的公共 API 主要由 FromArgs
derive 和 from_env
函数组成,它们可以用来从当前程序的命令行参数生成顶级 FromArgs
类型。
基本示例
use cargho::FromArgs;
#[derive(FromArgs)]
/// Reach new heights.
struct GoUp {
/// whether or not to jump
#[cargho(switch, short = 'j')]
jump: bool,
/// how high to go
#[cargho(option)]
height: usize,
/// an optional nickname for the pilot
#[cargho(option)]
pilot_nickname: Option<String>,
}
fn main() {
let up: GoUp = cargho::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 --height 5
./some_bin -j --height 5
./some_bin --jump --height 5 --pilot-nicknameWes
开关,如 jump
,是可选的,如果提供则设置为 true。
选项,如 height
和 pilot_nickname
,可以是必需的、可选的或重复的,具体取决于它们是否包含在 Option
或 Vec
中。可以使用 #[cargho(default = "<your_code_here>")]
属性提供默认值,在这种情况下,选项被视为可选的。
use cargho::FromArgs;
fn default_height() -> usize {
5
}
#[derive(FromArgs)]
/// Reach new heights.
struct GoUp {
/// an optional nickname for the pilot
#[cargho(option)]
pilot_nickname: Option<String>,
/// an optional height
#[cargho(option, default = "default_height()")]
height: usize,
/// an optional direction which is "up" by default
#[cargho(option, default = "String::from(\"only up\")")]
direction: String,
}
fn main() {
let up: GoUp = cargho::from_env();
}
可以反序列化自定义选项类型,只要它们实现了 FromArgValue
trait(自动为所有 FromStr
类型实现)。如果需要更自定义的解析,可以使用 from_str_fn
属性提供自定义 fn(&str) -> Result<T, String>
use cargho::FromArgs;
#[derive(FromArgs)]
/// Goofy thing.
struct FiveStruct {
/// always five
#[cargho(option, from_str_fn(always_five))]
five: usize,
}
fn always_five(_value: &str) -> Result<usize, String> {
Ok(5)
}
可以使用 #[cargho(positional)]
来声明位置参数。这些参数将按照结构中声明的顺序进行解析。
use cargho::FromArgs;
#[derive(FromArgs, PartialEq, Debug)]
/// A command with positional arguments.
struct WithPositional {
#[cargho(positional)]
first: String,
}
最后一个位置参数可以包含默认值,或者被包装在 Option
或 Vec
中,以表示可选或重复的位置参数。
也支持子命令。要使用子命令,为每个子命令声明一个单独的 FromArgs
类型,以及一个遍历每个命令的枚举。
use cargho::FromArgs;
#[derive(FromArgs, PartialEq, Debug)]
/// Top-level command.
struct TopLevel {
#[cargho(subcommand)]
nested: MySubCommandEnum,
}
#[derive(FromArgs, PartialEq, Debug)]
#[cargho(subcommand)]
enum MySubCommandEnum {
One(SubCommandOne),
Two(SubCommandTwo),
}
#[derive(FromArgs, PartialEq, Debug)]
/// First subcommand.
#[cargho(subcommand, name = "one")]
struct SubCommandOne {
#[cargho(option)]
/// how many x
x: usize,
}
#[derive(FromArgs, PartialEq, Debug)]
/// Second subcommand.
#[cargho(subcommand, name = "two")]
struct SubCommandTwo {
#[cargho(switch)]
/// whether to fooey
fooey: bool,
}
注意:这不是一个官方支持的 Google 产品。
依赖项
~2MB
~43K SLoC