#arguments-parser #command-line-arguments #arguments #derive #args

cargho

基于 derive 的参数解析器,优化以保持与 crates.io 的同步

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

BSD-3-Clause

35KB
451

Argh

Argh 是一个基于 derive 的、针对代码大小优化的参数解析器

crates.io license docs.rs Argh

基于 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。

选项,如 heightpilot_nickname,可以是必需的、可选的或重复的,具体取决于它们是否包含在 OptionVec 中。可以使用 #[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,
}

最后一个位置参数可以包含默认值,或者被包装在 OptionVec 中,以表示可选或重复的位置参数。

也支持子命令。要使用子命令,为每个子命令声明一个单独的 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