2 个版本

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

#125 in #argument


kurisu 中使用

MIT/Apache

32KB
349

Maintenance Test Coverage unsafe forbidden

kurisu-derive

Kurisu 库提供 derive(Kurisu)

Kurisu derive 宏不打算进行任何验证或显示命令行字符串值的用法。它只会根据给定的 Rust 结构体构建 kurisu::Arg 结构体,并将它们放在一个由 once_cell 静态实例包装的函数 get_info_instance 中,该实例是一个 kurisu::Info 结构体。

示例

use kurisu::*;

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

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

    // The Derive Macro add `from_args` function to the user's struct,
    // `from_args` will normalize the command line values into kurisu::Info.env_args
    let args = Yargs::from_args(&env_vars);

    let knots;
    // This scope is so the mutex guard gets released after
    // we retrieve the information we need.
    {
        // The Derive Macro also add `get_info_instance` function to the user's struct.
        // The Kurisu:Info struct holds all the parsed information the Derive Macro did.
        let info = Yargs::get_info_instance(&env_vars).lock().unwrap();
        knots = info.args.iter().find(|a| a.name == "knots").unwrap().clone();
    }

    // If we assume the current example was called as follow: `mycli --knots 8`
    // We would find that information within the Kurisu::Info struct
    assert_eq!(info.env_args, vec!["--knots=8".to_string()]);
    assert_eq!(knots.value, vec!["8".to_string()]);
    assert_eq!(args.knots, 8);
}

具有特定意义的 Rust 类型

类型 描述
bool 定义一个标志
u8 定义一个带有出现跟踪值作为其值的标志
String 定义 Option 或 Argument 的值类型
PathBuf 定义 Option 或 Argument 的值类型
usize 定义 Option 或 Argument 的值类型
isize 定义 Option 或 Argument 的值类型
f64 定义 Option 或 Argument 的值类型
Vec 定义重复的 Option 或 Argument

在主结构上覆盖默认行为

驱动这些行为的结构体由 kurisu::Info 处理,大部分注释都与它的一个字段相关。

字段名称 默认值 注释 描述
name "Unknown" name = "mycli" 更改用法屏幕上的名称
version 0 version = "0.1.0" 更改用法屏幕上的版本
desc None desc = "some short text" 更改用法屏幕上的描述
doc None /// 更改用法屏幕上的 DISCUSSION 文本
allow_noargs false allow_noargs 如果没有命令行值,则不显示用法屏幕
    cargo 将尝试从Cargo.toml中获取名称、版本和描述,具体字段注解优先于Cargo注解
    nosort 避免在用法屏幕上按字母顺序排序参数、标志和选项
    auto_shorts 启用根据其字段名称首字母自动生成短标志/选项,默认情况下不生成短标志/选项,除非在结构体字段的注解中指定

示例

    #[derive(Debug, Kurisu)]
    // Only picks the version from Cargo.toml since name & desc are already present
    #[kurisu(name = "yargs", cargo, desc = "some desc here", auto_shorts)]
    /// This text is for the DISCUSSION
    /// section in the use screen
    ///
    /// It can be a very large text
    struct Yargs {}

覆盖主结构体字段上的默认行为

驱动这些行为的结构体由 kurisu::Arg 处理,大多数注解都与它的某个字段相关。

字段名称 默认值 注释 描述
vname 字段名称 vname = "myname" 更改在用法屏幕上的名称
position None pos pos = "1" 定义参数的位置,pos 没有值定义了一个无限位置参数
doc None /// 定义用法屏幕上参数的描述
short None short short = "b" 更改短标志/选项使用的字母,否则使用结构体字段名称的第一个字母
long 字段名称 nolong long = "myname" 更改或删除长标志/选项
env 字段名称 env = "MYSQL_HOST" 默认情况下,字段名称用于在最后手段中查找匹配的环境变量,这是更改要匹配哪个环境变量的方式
env_prefix None env_prefix = "MYSQL_" 将字段名称前缀并查找匹配的环境变量
required_if None required_if = "fieldname" 如果存在其他标志/选项,则将此选项设置为必需
default "" default = "42" 如果命令行中没有值,结构体字段将分配此默认值,而不是默认类型值
exit None exit = "my_exit_func" 在执行后触发 std::process::exit() 的本地函数。有点像用法显示,它将在 from_args 处停止执行
    parse_with = "my_func" 允许对此参数/标志/选项进行自定义解析的本地函数

示例

use std::path::PathBuf;

#[derive(Debug, Kurisu)]
struct Yargs {
    #[kurisu(pos = 1)]
    file: PathBuf,
    #[kurisu(pos)] // Infinite positional argument
    others: String,
    #[kurisu(short, nolong, env_prefix = "MYSQL_")]
    host: String,
    #[kurisu(long = "very-long-flag")]
    more: bool,
    /// description for `crashed` on usage screen
    crashed: bool,
}

许可协议:MIT OR Apache-2.0

依赖项

~1.5MB
~36K SLoC