usage-rs 6.2.0

A compiled CLI parser for Rust, built on usage specs
Documentation

The facade for building compiled Rust CLIs with usage.

Depend on usage-rs under the short crate name usage. That is the one package an application needs: derive macros, the argv runtime, help, and clap-shaped errors ship in the defaults. Completions stay behind a feature; low-level adopters that want only the binding runtime keep depending on usage-argv directly.

[dependencies]
usage = { package = "usage-rs", version = "6" }

What happens after a parse can come from the same declaration: a command implements [Run], the subcommand enum says #[usage(run)], and the match that routes argv to the code carrying it out is generated rather than written. [RunWith] under #[usage(run_with)] hands each command shared state, and [RunAsync] / [RunAsyncWith] under #[usage(run_async)] / #[usage(run_async_with)] are the async pair. Nothing about any of it reaches the spec.

Enable portable expression validation only when a CLI declares validate rules:

usage = { package = "usage-rs", version = "6", features = ["validation"] }
use usage_rs as usage;
# #[cfg(feature = "spec")]
use usage::Cli;

# #[cfg(not(feature = "spec"))]
# fn main() {}
# #[cfg(feature = "spec")]
# fn main() {
#[derive(Cli)]
#[usage(bin = "ex")]
struct Ex {
    #[usage(long, value_hint = usage::ValueHint::FilePath)]
    file: Option<std::path::PathBuf>,
}

let argv = [std::ffi::OsStr::new("--file"), std::ffi::OsStr::new("input.txt")];
let ex = Ex::parse_from(&argv).expect("valid command line");
assert_eq!(ex.file.as_deref(), Some(std::path::Path::new("input.txt")));
# }