2 个版本
0.1.6 | 2022年5月31日 |
---|---|
0.1.5 | 2022年5月22日 |
#929 in 命令行界面
44KB
767 行
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-flag
,mycli -f
。它们的结构字段类型始终为 bool
。它们没有关联的值,例如:mycli -f value
被视为一个跟在后面的参数的标志,除非 -f
被定义为选项。
可以堆叠短标志,例如:mycli -fBc
。
也可以有重复的标志,并计算它们的出现次数,例如 mycli -vvv
。在这种情况下,结构字段类型为 u8
。
标志始终是可选的。没有方法使它们变为必需。
选项
以 -
或 --
开头,后面跟一个值,例如:mycli --my-option=myvalue
,mycli -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