2 个版本

0.1.6 2022年5月31日
0.1.5 2022年5月22日

#929 in 命令行界面

MIT/Apache

44KB
767

Maintenance Test Coverage unsafe forbidden

kurisu

通过自定义 derive 宏进行命令行参数解析

有关 derive(Kurisu) 的完整文档,请参阅 kurisu_derive

解析、验证和使用显示

库鲁斯将这三个概念分开

use kurisu::*;

#[derive(Debug, Kurisu)]
struct Yargs {
    knots: usize,
}

fn main() {
    let env_vars: Vec<String> = std::env::args().skip(1).collect();

    // Will take the string values from the command line and try to parse them and assign
    // them to the struct's field. If the flag or option is not present then
    // its default type value will be assigned to the struct's field.
    // In this case: usize::default()
    let args = Yargs::from_args(env_vars);

    // Returns an Option<kurisu::arg::Error> or None
    let arg_error = kurisu::validate_usage(&args);

    // If an error is present `print_usage_error` will std::process::exit()
    // with kurisu::ExitCode::USAGE(64) as exit code
    mayuri::print_usage_error(&args, arg_error);

    // Assuming the application was called like so: `mycli --knots 8`
    assert_eq!(args.knots, 8);
}

您可以将其缩短为 kurisu::valid_exit(&args),它结合了 kurisu::validate_usage(&args)mayuri::print_usage_error(&args)

库鲁斯试图为结构体设置合理的默认值,如果我们以以下结构体为例

struct Yargs {
    sinking: bool,
    knots: usize,
    pirate_ship_name: String
}

字段 pirate_ship_name 将没有短选项 -p,而只有长选项 --pirate-ship-name。字段名称中的字符 _ 将匹配并显示为 -。由于类型为 bool,字段 sinking 将是一个标志。默认值可以通过注解修改,有关更多信息,请参阅 kurisu_derive

库鲁斯对参数、标志和选项有具体定义。它们绝对不是官方定义,但这就是在这个库中处理它们的方式。

参数

命令行中的一个单词,例如:mycli myargument。也称为位置参数,其中您可以将特定结构体字段定义为特定参数位置。

它们从不以 --- 开头。支持的结构体字段类型

  • 字符串,
  • PathBuf,
  • usize,
  • isize,
  • f64,
  • bool,

可以定义一个无限位置参数,其中该结构字段值将包含所有位置参数(不包括其他具有特定位置的定义参数)。无限位置参数结构字段类型定义为 Vec<T> 和支持的一种类型。

参数总是必须的。没有方法使它们变为可选。

标志

--- 开头,例如:mycli --my-flagmycli -f。它们的结构字段类型始终为 bool。它们没有关联的值,例如:mycli -f value 被视为一个跟在后面的参数的标志,除非 -f 被定义为选项。

可以堆叠短标志,例如:mycli -fBc

也可以有重复的标志,并计算它们的出现次数,例如 mycli -vvv。在这种情况下,结构字段类型为 u8

标志始终是可选的。没有方法使它们变为必需。

选项

--- 开头,后面跟一个值,例如:mycli --my-option=myvaluemycli -f myvalue。选项值赋值运算符可以是 = 。它们支持与参数相同的类型。

可以有重复的选项,例如:mycli -f one -f=two -f three,在这种情况下,它们的结构字段类型为 Vec<T>,具有有效类型。

选项默认总是可选的,但如果有值,则值总是必需的。可以通过注解 required_if 使选项成为必需,更多详细信息请参阅 kurisu_derive

许可:MIT OR Apache-2.0

依赖项

~1.7–2.5MB
~48K SLoC