facet-args

Crates.iofacet-args
lib.rsfacet-args
version0.29.0
created_at2025-04-10 03:39:14.09265+00
updated_at2025-09-17 18:24:50.719671+00
descriptionCommand-line argument parsing for the facet ecosystem
homepage
repositoryhttps://github.com/facet-rs/facet-args
max_upload_size
id1627609
size86,483
Amos Wenger (fasterthanlime)

documentation

https://docs.rs/facet-args

README

facet-args

Coverage Status crates.io documentation MIT/Apache-2.0 licensed Discord

Provides CLI argument parsing (WIP).

use facet_pretty::FacetPretty;
use facet::Facet;

#[derive(Facet)]
struct Args {
    #[facet(positional)]
    path: String,

    #[facet(named, short = 'v')]
    verbose: bool,

    #[facet(named, short = 'j')]
    concurrency: usize,
}

# fn main() -> Result<(), Box<dyn std::error::Error>> {
let args: Args = facet_args::from_slice(&["--verbose", "-j", "14", "example.rs"])?;
eprintln!("args: {}", args.pretty());
Ok(())
# }

Behavior

The behavior of facet-args is still in flux, but here are the broad strokes:

  • We're always parsing to a struct (not an enum, vec etc.)
  • The struct we're parsing to is always owned — no borrowing happening here, it gets too complicated with &'slice [&'text str]
  • Arguments are either positional or named — fields lacking either annotation are ignored
  • Accepted syntaxes for short flags are: short = 'v' and short = "v" (where v can be any letter)
  • positional args of type Vec (or anything that has a Def::List) will soak up all the positional arguments — if followed by positional arguments of type String for example, those will never get filled
  • After parsing every available argument, uninitialized struct fields are filled with their default value if they have facet(default) set: this includes Vec.

Sponsors

Thanks to all individual sponsors:

GitHub Sponsors Patreon

...along with corporate sponsors:

AWS Zed Depot

...without whom this work could not exist.

Special thanks

The facet logo was drawn by Misiasart.

License

Licensed under either of:

at your option.

Commit count: 8

cargo fmt