[][src]Crate argwerk

Documentation Crates Actions Status

Helper utility for parsing simple commandline arguments.

This is not intended to be a complete commandline parser library. Instead this can be used as an alternative quick-and-dirty approach that can be cheaply incorporated into a tool.

We provide:

  • A dependency-free commandline parsing framework using declarative macros. So it's hopefully lightweight and compiles quickly.
  • A flexible mechanism for parsing.
  • Formatting decent looking help messages.

We specifically do not support:

  • As-close-to correct line wrapping with wide unicode characters as possible (see textwrap).
  • Required arguments. If your argument is required, you'll have to ok_or_else it yourself from an Option<T>.
  • Complex command structures like subcommands.

For a more complete commandline parsing library, use clap.

See the documentation for argwerk::parse! for how to use.

Examples

This is available as a runnable example:

cargo run --example tour
let args = argwerk::parse! {
    /// A command touring the capabilities of argwerk.
    "tour [-h]" {
        help: bool,
        file: Option<String>,
        input: Option<String>,
        limit: usize = 42,
        positional: Option<(String, Option<String>)>,
        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" => {
        help = true;
        print_help();
        Ok(())
    }
    /// Limit the number of things by <n>.
    "--limit" | "-l", n => {
        limit = str::parse(&n)?;
        Ok(())
    }
    /// Write to the file specified by <path>.
    "--file", path if !file.is_some() => {
        file = Some(path);
        Ok(())
    }
    /// Read from the specified input.
    "--input", #[option] path => {
        input = path;
        Ok(())
    }
    /// 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;
        Ok(())
    }
}?;

dbg!(args);

Macros

parse

Parse commandline arguments.

Structs

Error

An error raised by argwerk.

Enums

ErrorKind

The kind of an error.