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 命令行界面

Download history 30/week @ 2024-03-11 13/week @ 2024-03-18 32/week @ 2024-03-25 57/week @ 2024-04-01 56/week @ 2024-04-08 16/week @ 2024-04-15 15/week @ 2024-04-22 20/week @ 2024-04-29 1/week @ 2024-05-06 2/week @ 2024-05-13 16/week @ 2024-05-20 16/week @ 2024-05-27 23/week @ 2024-06-03 36/week @ 2024-06-10 37/week @ 2024-06-17 14/week @ 2024-06-24

每月111次下载
用于 2 crates

MIT/Apache

67KB
837 行代码

argwerk

github crates.io docs.rs build status

通过声明式宏定义简单命令行解析器。

这**不是**一个完整的命令行解析器库。相反,它可以作为一个快速且便宜的选择,可以轻松地集成到工具中。

对于更完整的命令行解析库,请使用clap

我们提供

  • 使用声明式宏的无依赖命令行解析框架。
  • 灵活的解析机制。
  • 美观的帮助信息格式化。

我们不提供

  • 尽可能接近正确的宽Unicode字符行包装(见textwrap)。
  • 内置复杂命令结构,如子命令(见子命令示例,了解如何实现)。

有关用法,请参阅argwerk::defineargwerk::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 添加单个换行符触发的。
**: argh 0.1.4 包括11个依赖项。
***: clap 3.0.0-beta.2 包括32个依赖项。

您可以尝试使用以下方式自行构建:

cargo run --manifest-path tools/builder/Cargo.toml

无运行时依赖