#env #parser #getopt #command-line #args #cli-parser #cli

simple_getopt

另一种简单的命令行选项解析工具 - (YAGPCUBEAS)

1 个不稳定版本

0.1.1 2021年7月16日
0.1.0 2021年7月16日

#582 in 配置

MIT 许可证

6.5MB
124

包含 (Mach-o 可执行文件, 460KB) target/release/simple_getopt,(Mach-o 可执行文件, 460KB) target/release/deps/simple_getopt,(Rust 库, 82KB) libarraylist-ab55d80cbc577b38.rlib,(Rust 库, 105KB) libsimple_getopt-c85389c2e3c16031.rlib,(Rust 库, 105KB) target/release/libsimple_getopt.rlib

simple_getopt

名称

simple_getopt -- 另一种简单的命令行选项解析工具 - (YAGPCUBEAS).

安装

在 Cargo.toml 文件中

[dependancies]
simple_getopt = "0.1.0"

在 main.rs 文件中

使用方法

use simple_getopt::Getopt;

描述

simple_getopt - 通过拆分每个选项以方便使用来解析命令行选项。这个crate可以轻松解析CLI选项,让用户无障碍地使用。

simple_getopt 返回一个只读的哈希表实现。因此,所有从CLI给出的选项分为两类

  1. 没有附加值的标志/开关。这些被视为 boolean 值。
  2. 附加了值的选项。这些可以作为HashMap的常规键/值使用。

应该强调的是 simple_getopt 的任务是解析(即优雅地拆分)从CLI给出的选项,并允许用户专注于如何使用这些选项,而不必担心格式。返回的选项是只读的。所以,用户或程序无法修改从CLI给出的选项,因此不会有惊喜。

示例

        use getopt::Getopt;
        use std::env
        ...
        // using the following from the CLI
        // cargo run -- -a=[1, 2, 3, 4, 5] -b=[6, 7, 8, 9, 10] -c=[11, 12, 13]
        fn main() {
            // All you need. CLI options parsed there. 
            let parser = Getopt::std(&std::env::args().collect::<Vec<_>>());

            for val in ["a", "b", "c"].iter() {
                if parser.exists(val) {
                    println!(
                        "{:?}",
                        &parser[val]
                            .chars()
                            .map(|a| u64::from_str(&a.to_string()))
                            .map(|a| if let Ok(a) = a { a } else { 0 })
                            .sum::<u64>()
                    );  // 15, 40, 36
                }
            }
        }
    use getopt::Getopt;
    use std::env
    use std::fs::File;
    use std::io::{BufRead, BufReader};
    ...

    let parse = Getopt::std(&env::args().collect::<Vec<_>>()); // parsing done.

       // if you have an option -i with a value which is a valid file
       // it reads the file to the standard output device.
       if parse.exists("i") {
           let file = File::open(&parse["i"]).unwrap();
           let buf = BufReader::new(file);
           for line in buf.lines() {
               println!("{}", line.unwrap());
           }
       }
    use getopt::Getopt;
    use std::env
    ...
    let parse = Getopt::std(&env::args().collect::<Vec<_>>()); // parsing done.

    // print all keys and values
    println!("{}, {}", parse.get_keys(), parse.get_values()); 

    // cargo run -- -x=12 -y=24
    println!(
        "{:?}",
        parse["x"].parse::<u64>().unwrap() + parse["y"].parse::<u64>().unwrap()
    ); // 36

    // User need `use std::str::FromStr;` for below code to work
    println!(
        "{}",
        u64::from_str(&parse["x"]).unwrap() + u64::from_str(&parse["y"]).unwrap()
    ); // 36

Simple-Getopt 方法

simple_getopt 返回一个只读的哈希表实现。因此,提供了以下函数使用

  1. std

    pub fn std(arr: &[String]) -> Getopt

    • 这是一个关联函数。它接收String切片的引用并返回结构Getopt。这是获取从CLI给出的所有选项的函数。用户 不需要 跳过任何选项,包括程序名称。
        let parser = Getopt::std(&env::args().collect::<Vec<_>>());
    
  2. get_keys

    pub fn get_keys(&self) -> ArrayList<String>

    • 此函数返回所有标志和选项的集合,作为键/值选项的键。 ArrayList 是Rust向量的包装。它开箱即用。
    println!("Keys: {}", parser.get_keys());
    //or
    parser.get_keys().print(); //.print() is from ArrayList
    
  3. get_values

    pub fn get_values(&self) -> ArrayList<String>

    • 此函数返回键/值选项中所有标志和选项的集合作为值。 ArrayList 是 Rust 向量的包装。它开箱即用。
    println!("Values: {}", parser.get_values());
    //or
    parser.get_values().print(); //.print() is from ArrayList
    
  4. 存在

    pub fn exists(&self, key: &str) -> bool

    • 它返回一个布尔值,要么是 false,要么是 true,如果提供的键是 CLI 选项中 getopt 返回的实例中的键。

设计限制

由于简洁性是此 crate 设计的核心,因此遵循以下设计选项

  1. 标志或开关是单字符的,并使用单个短横线,如下所示: -a -b -c。用户不能使用双短横线或一个以上的字母作为标志。即 --file 不允许。

  2. 标志 不能 相结合,即 -abc 不允许。每个标志 必须 单独。这可能在未来的版本中改变。

  3. 具有键/值的选项也使用单短横线和字母。键 必须 使用等号 =、空格 或冒号 : 与值分开。如下所示: -f=my_text_file.txt-o:output_file.txt'i input_file.db'注意:如果使用空格分隔标志和值,则必须相应地引用它们。用户程序将因错误的分隔符而崩溃。

替代方案

在 Rust crate 中还有其他一些很好的 getopts。它们中的许多都非常详细、有见解且功能强大,但不如 simple_getopt 简单。如果您想检查它们,以便在需要更自定义 CLI 选项的情况下; clap(https://crates.io/crates/clap)、structopt(https://crates.io/crates/structopt)、argh(https://crates.io/crates/argh) 等。

依赖关系

~2MB