#arguments-parser #command-line-arguments #cli-parser #trivial #parsable #how

trivial-argument-parser

用于解析命令行参数的小型库

4 个版本 (2 个重大更新)

0.3.1 2023年6月25日
0.3.0 2023年6月24日
0.2.0 2021年4月13日
0.1.0 2020年9月18日

#2 in #trivial

每月下载量29

MIT 许可证

45KB
893

crates.io

trivial-argument-parser

这个crate是在一个小型的私有项目中创建的。它最初是一个小型库,目的是作为作者的测试平台。从那时起,没有真正发生变化,因为没有引入有价值的改进。最近,我重新回到了这个crate,引入了版本0.3.0,其中更改大幅改变了其开发方式。希望我会花更多时间在这个项目上,这样它就不会看起来像一堆被遗弃的混乱。

用法

使用 Rust 编写的简单参数解析器。它提供了一种简单的方法来定义和解析命令行参数。示例应用程序在版本0.3.0中使用此库。

use trivial_argument_parser::{
    args_to_string_vector,
    argument::{
        parsable_argument::ParsableValueArgument,
        ArgumentIdentification
        },
    ArgumentList,
};

fn main() {
    let mut args_list = ArgumentList::new();
    let mut argument_int = ParsableValueArgument::new_integer(
            ArgumentIdentification::Short('n')
        );
    let mut argument_str =
        ParsableValueArgument::new_string(
            ArgumentIdentification::Long(String::from("path"))
        );
    args_list.register_parsable(&mut argument_int);
    args_list.register_parsable(&mut argument_str);
    args_list
        .parse_args(args_to_string_vector(std::env::args()))
        .unwrap();
    println!("n - {}", argument_int.first_value().unwrap());
    println!("path - {}", argument_str.first_value().unwrap());
}

运行此代码并传递参数

cargo run -- -n 131 --path abc
> n - 131
> path - abc

定义自己的参数处理器

您可以通过使用关联函数ParsableValueArgument::new来定义自己的处理器。您需要指定如何通过遍历输入迭代器来处理参数值(它可以通过调用next()获取一个或多个值,或者可以通过它来设置一个标志)。输入迭代器是可查看的,可以用于更复杂的控制。如果需要保存参数的值,则处理器必须使用提供的可变借用值向量(处理器可以决定是否可以保存多个值)。已定义的参数处理器的示例 - 预定义整数参数处理器

let handler = |input_iter: &mut Peekable<&mut std::slice::Iter<'_, String>>,
                       values: &mut Vec<i64>| {
            if let Option::Some(v) = input_iter.next() {
                let validation = ParsableValueArgument::validate_integer(v);
                if let Option::Some(err) = validation {
                    return Result::Err(err);
                }
                match v.parse() {
                    Result::Ok(v) => {
                        values.push(v);
                        Ok(())
                    }
                    Result::Err(err) => Result::Err(format!("{}", err)),
                }
            } else {
                Result::Err(String::from("No remaining input values."))
            }
        };
        ParsableValueArgument::new(identification, handler)

此库的未来

尽管这个crate的开发进展缓慢,但也有一些计划添加更多功能。最大的目标是引入宏来从结构中定义参数。除此之外,还有一些代码部分可以改进。考虑到遗留API现在已经没有用了,所以我打算摆脱它。

无运行时依赖