#参数解析器 #参数 #命令行 #解析器 #CLI #选项

anpcli

一个简单、易用且高度可定制的命令行参数解析器

1 个不稳定版本

0.1.0 2023年10月14日

#93#参数

自定义许可证

84KB
1.5K SLoC

anpcli


lib.rs:

AnpCLI 库

AnpCLI 库提供了解析命令行选项的 API。它还可以打印帮助信息,显示可用的选项。

AnpCLI 简单、易于学习和使用,但同时也高度可定制。它受到了 Java 库 Apache Commons CLI 的启发。

AnpCLI 支持不同类型的选项

  • POSIX 类似的选项,例如 tar -zxvf foo.tar.gz
  • GNU 类似的长选项,例如 du --human-readable --max=1
  • 带有附加值的短选项,例如 gcc -O2 foo.c
  • 带有单个短划线的长选项,例如 ant -projecthelp

AnpCLI 显示的典型帮助信息如下

usage: ls
 -A,--almost-all          do not list implied . and ..
 -a,--all                 do not hide entries starting with .
 -B,--ignore-backups      do not list implied entried ending with ~
 -b,--escape              print octal escapes for nongraphic characters
 --block-size <SIZE>      use SIZE-byte blocks
 -c                       with -lt: sort by, and show, ctime (time of last
                          modification of file status information) with
                          -l:show ctime and sort by name otherwise: sort
                          by ctime
 -C                       list entries by columns

示例

一个简单的示例。

use anpcli::{AnpOption, Parser, DefaultParser, HelpFormatter, Options};

let mut options = Options::new();
options.add_option2("A", "almost-all", false, "do not list implied . and ..").unwrap();
options.add_option2("a", "all", false, "do not hide entries starting with .").unwrap();
options.add_option(AnpOption::builder()
                    .long_option("block-size")
                    .arg_name("SIZE")
                    .has_arg(true)
                    .desc("use SIZE-byte blocks")
                    .build().unwrap());

let mut formatter = HelpFormatter::new("ls");
let mut parser = DefaultParser::builder().build();
let cmd = parser.parse_or_exit(&options, &formatter);

println!("almost-all: {}", cmd.has_option("almost-all"));
println!("all: {}", cmd.has_option("all"));
if cmd.has_option("block-size") {
    println!("block-size: {}", cmd.get_expected_value::<usize>("block-size"));
}

一个更复杂的示例。

use std::io::stdout;
use std::process::exit;
use std::time::SystemTime;
use anpcli::{AnpOption, Parser, DefaultParser, HelpFormatter, Options};

let mut options = Options::new();
options.add_option1("d", "show datetime").unwrap();
options.add_option(AnpOption::builder()
    .long_option("log-level")
    .number_of_args(1)
    .required(false)
    .optional_arg(false)
    .desc("The level of log to print in console")
    .build().unwrap());

let mut formatter = HelpFormatter::new("<file> [<file> ...]");
formatter.set_auto_usage(true);
formatter.set_header("A file processing tool.");

let mut parser = DefaultParser::builder().build();
let cmd = parser.parse_args(&options, &vec!["file_tool", "demo.txt", "main.txt"]);

if cmd.is_err() {
    eprintln!("parse error: {}", cmd.unwrap_err());
    exit(1);
}
let cmd = cmd.unwrap();

let files = cmd.get_arg_list();
if files.len() <= 1 {
    eprintln!("missing option <file>");
    formatter.print_help(&mut stdout(), &options);
    exit(1);
} else {
    println!("processing file: {:?}", &files[1..]);
}
if cmd.has_option("d") {
    let datetime = SystemTime::now()
                    .duration_since(SystemTime::UNIX_EPOCH)
                    .unwrap().as_millis();
    println!("datetime={}", datetime);
}
if cmd.has_option("log-level") {
    let log_level = cmd.get_expected_value::<String>("log-level");
    println!("log-level={}", log_level);
}

无运行时依赖