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);
}