#arguments-parser #command-line #args #cmd #cli

argust

用于Rust程序的简单易用的命令行解析器

3个版本

0.1.0 2023年2月9日
0.0.3 2023年2月12日
0.0.2 2023年2月12日
0.0.1 2023年2月9日

#474 in 命令行界面

每月 25 次下载

MIT 许可证

14KB
212

Argust

一个简单的命令行解析器,它将接受程序参数的向量,并返回一个排序的结构,可用于直接执行程序。

Argust旨在针对较小的工具,这些工具希望避免由于声明式或派生参数解析器提供的强大灵活性和输入验证而引入的额外复杂性。这是一个快速简单的库,用于处理基本的参数处理需求。

无需设计输入,准备参数层次结构。无需特定顺序,只需将字符串添加到列表中即可更新参数。

不支持包含非有效Unicode的字符串。

在Argust的上下文中,命令行分为三个部分-

  • 参数 - 代表程序命令或参数的参数。例如,在 cp test.rs test2.rs 中,“test.rs” 和 “test2.rs” 是参数。
  • 短参数 - 这些是单个字符开关,可以修改程序的行为。例如,在 cp test.rs test2.rs -f 中,“-f” 是一个开关。这些也可以包含传递给程序的值。例如,在 ./test -t cpp 中,cpp 可以是传递给程序的值。
  • 长参数 - 行为与短参数相同。不同之处在于这些是键入的。短参数通常是长参数的快捷方式。例如,在 cp test.rs test2.rs --buffer-size=2048 中,“--buffer-size=2048” 更新了默认的复制缓冲区以使用2048的值。

如何使用

基本用法

使用方法非常简单。

    let args: Vec<String> = env::args().skip(1).collect();
    let command_set: ArgContext = commands::parse_args(args, None);

    // Use the values as required
    if let Some(command) = command_set.commands.first() {
        handle_command(command);
    } else {
        basic_commands::help();
    }

ArgContext 对象包含有关传递的参数的结构化信息。它定义为-

pub struct ArgContext {
    pub long_params: HashMap<String, Option<String>>,
    pub short_params: HashMap<String, Option<String>>,
    pub args: Vec<String>,
}

请注意,options 不一定需要是键值对。即 cp --version 将返回一个具有键 'version' 和值 None 的哈希表。

配置参数样式

通过使用以下对象并传递给 parse_args 方法,甚至可以覆盖默认的解析标记,例如,对于开关使用“-”,对于选项使用“--”。

pub struct ParseToken {
    pub option: String,
    pub option_key: String,
    pub switch: String,
}

在命令 testApp hello --print=stdin -f 中,"--" 是 option,"=" 是 option_key,"-" 是 switch

解析器的默认配置是 -

ParseTokens {
    long_token: new_string!("--"),
    long_seperator: new_string!("="),
    short_token: new_string!("-"),
}

为了指定哪些短参数与值相关联,我们需要设置 ParserConfigparameterized_switch_list 字段。

这意味着解析器将如何行为 - ./test -h myval --long=MyLongVal command 这将生成 - args = ["command"], short=[{"h", "myval"}], long=[{"long","MyLongVal"}] 相对顺序并不重要。

只要配置了 parameterized_switch_list,以下输入也是有效的 - ./test -hMyval

接受空格分隔的长参数

为了修改解析器以接受空格分隔的长值,例如 ./test --long MyLongValue command,我们需要按以下方式更新配置 -

let mut parse_config = ParserConfig::new();
parse_config.parse_tokens = ParseTokens {
    long_token: String::from("--"),
    long_seperator: String::from(" "),
    short_token: String::from("-"),
};

请注意:如果我们设置 long_seperator 为 " ",那么将 ParserConfigparameterized_option_list 设置为指定哪些长参数将具有值非常重要。否则,这些值将被接收为命令。对于除 " " 之外的其他 long_seperator 值,此字段将被忽略,因为值将通过分割参数生成。

查询参数

parse_args 的调用将返回一个 ArgContext 对象。此对象可用于提取有关传递的参数的信息,例如。

let context: ArgContext = commands::parse_args(args, None);
let (isTest, testPath) context.contains_short('t');
if isTest {
    println!("the path is {}", testPath.unwrap());
}

查询辅助方法参考 -

pub fn contains_short(&self, short: char) -> (bool, Option<String>);
pub fn contains_long(&self, long: &str) -> (bool, Option<String>);
pub fn contains(&self, short: Option<char>, long: Option<&str>) -> (bool, Option<String>) ;

除此之外,您还可以直接通过 ArgContext 中的数据查询状态。

let context: ArgContext = commands::parse_args(args, None);
match context.args.first() {
    "test" => run_test(),
    "validate" => run_validate(),
    _ => print_help()
};

无运行时依赖