use nanoargs::{ArgBuilder, Flag, Opt, ParseError, Pos};
fn num_cpus() -> u32 {
std::thread::available_parallelism().map(|n| n.get() as u32).unwrap_or(1)
}
fn main() {
let parser = ArgBuilder::new()
.name("builder-demo")
.description("Demonstrates the manual builder API for power users")
.flag(Flag::new("verbose").desc("Enable verbose output").short('v'))
.flag(Flag::new("debug").desc("Internal debug mode").hidden())
.option(Opt::new("output").placeholder("FILE").desc("Output file path").short('o').required())
.option(Opt::new("jobs").placeholder("NUM").desc("Number of parallel jobs").short('j').default("4"))
.option(Opt::new("include").placeholder("DIR").desc("Directories to include (repeatable)").short('I').multi())
.positional(Pos::new("input").desc("Input file to process").required())
.positional(Pos::new("extra").desc("Additional arguments").multi())
.build()
.unwrap();
match parser.parse_env() {
Ok(result) => {
let verbose = result.get_flag("verbose");
let debug = result.get_flag("debug");
let output: String = result.get_option_required("output").unwrap();
let jobs: u32 = result.get_option_or_default("jobs", 4).unwrap();
let raw_jobs = result.get_option("jobs");
let parsed_jobs: Option<Result<u32, _>> = result.get_option_parsed("jobs");
let jobs_or: u32 = result.get_option_or("jobs", || num_cpus()).unwrap();
let includes = result.get_option_values("include");
let include_strs: Vec<Result<String, _>> = result.get_option_values_parsed("include");
let includes_or: Vec<String> = result.get_option_values_or_default("include", vec!["src".into()]).unwrap();
let positionals = result.get_positionals();
println!("verbose: {verbose}");
println!("debug: {debug}");
println!("output: {output}");
println!("jobs: {jobs}");
println!("raw jobs: {raw_jobs:?}");
println!("parsed jobs: {parsed_jobs:?}");
println!("jobs (or): {jobs_or}");
println!("includes: {includes:?}");
println!("includes (p): {include_strs:?}");
println!("includes (d): {includes_or:?}");
println!("positionals: {positionals:?}");
}
Err(ParseError::HelpRequested(text)) => print!("{text}"),
Err(e) => eprintln!("error: {e}"),
}
}