27个版本 (破坏性更新)
0.20.4 | 2023年3月22日 |
---|---|
0.20.2 | 2023年1月2日 |
0.20.1 | 2022年3月8日 |
0.20.0 | 2021年1月5日 |
#165 in 命令行界面
每月111次下载
用于 2 crates
67KB
837 行代码
argwerk
通过声明式宏定义简单命令行解析器。
这**不是**一个完整的命令行解析器库。相反,它可以作为一个快速且便宜的选择,可以轻松地集成到工具中。
对于更完整的命令行解析库,请使用clap。
我们提供
- 使用声明式宏的无依赖命令行解析框架。
- 灵活的解析机制。
- 美观的帮助信息格式化。
我们不提供
有关用法,请参阅argwerk::define和argwerk::args的文档。
用法
最初在您向程序添加参数时,可以使用argwerk::args。这允许轻松解析少量可选参数。
此示例作为
simple
提供。cargo run --example simple -- --limit 20
let args = argwerk::args! {
/// A simple tool.
"tool [-h]" {
help: bool,
limit: usize = 10,
}
/// The limit of the operation. (default: 10).
["-l" | "--limit", int] => {
limit = str::parse(&int)?;
}
/// Print this help.
["-h" | "--help"] => {
println!("{}", HELP);
help = true;
}
}?;
if args.help {
return Ok(());
}
dbg!(args);
一段时间后,您可能希望升级到定义包含参数的命名结构。如果您想传递参数,这可能很有用。
此示例作为
tour
提供。cargo run --example tour -- --help
use std::ffi::OsString;
argwerk::define! {
/// A command touring the capabilities of argwerk.
#[derive(Default)]
#[usage = "tour [-h]"]
struct Args {
help: bool,
#[required = "--file must be specified"]
file: String,
input: Option<String>,
limit: usize = 10,
positional: Option<(String, Option<String>)>,
raw: Option<OsString>,
rest: Vec<String>,
}
/// Prints the help.
///
/// This includes:
/// * All the available switches.
/// * All the available positional arguments.
/// * Whatever else the developer decided to put in here! We even support wrapping comments which are overly long.
["-h" | "--help"] => {
println!("{}", Args::help());
help = true;
}
/// Limit the number of things by <n> (default: 10).
["--limit" | "-l", n] => {
limit = str::parse(&n)?;
}
/// Write to the file specified by <path>.
["--file", path] if !file.is_some() => {
file = Some(path);
}
/// Read from the specified input.
["--input", #[option] path] => {
input = path;
}
/// A really long argument that exceeds usage limit and forces the documentation to wrap around with newlines.
["--really-really-really-long-argument", thing] => {
}
/// A raw argument that passes whatever was passed in from the operating system.
["--raw", #[os] arg] => {
raw = Some(arg);
}
/// Takes argument at <foo> and <bar>.
///
/// * This is an indented message. The first alphanumeric character determines the indentation to use.
[foo, #[option] bar, #[rest] args] if positional.is_none() => {
positional = Some((foo, bar));
rest = args;
}
}
// Note: we're using `parse` here instead of `args` since it works better
// with the example.
let args = Args::parse(vec!["--file", "foo.txt", "--input", "-"])?;
dbg!(args);
与其他项目的时间和时间大小比较
argwerk旨在成为一个轻量级的依赖项,编译速度快。在这方面,它与其他项目相比是这样的。
以下摘要是从这里找到的项目生成的。
项目 | cold build (发布) | rebuild* (发布) | size (发布) |
---|---|---|---|
argh** | 5.142723s (4.849361s) | 416.9594ms (468.7003ms) | 297k (180k) |
argwerk | 1.443709s (1.2971457s) | 403.0641ms (514.036ms) | 265k (185k) |
clap*** | 11.9863223s (13.1338799s) | 551.407ms (807.8939ms) | 2188k (750k) |
**: 重建是由向
main.rs
添加单个换行符触发的。
**: argh0.1.4
包括11个依赖项。
***: clap3.0.0-beta.2
包括32个依赖项。
您可以尝试使用以下方式自行构建:
cargo run --manifest-path tools/builder/Cargo.toml