Skip to content

facet-rs/facet-args

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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.

About

CLI argument parsing library for the facet ecosystem

Resources

Stars

Watchers

Forks

Sponsor this project

  •  

Packages

No packages published

Languages