blob: 7b13f5d12662b636d6b344dd0ebf19abcca95ee2 [file] [log] [blame]
use std::path::PathBuf;
use std::ffi::OsStr;
use pico_args::Arguments;
#[derive(Debug)]
struct AppArgs {
help: bool,
number: u32,
opt_number: Option<u32>,
width: u32,
input: Option<PathBuf>,
free: Vec<String>,
}
fn parse_width(s: &str) -> Result<u32, &'static str> {
s.parse().map_err(|_| "not a number")
}
fn parse_path(s: &OsStr) -> Result<PathBuf, &'static str> {
Ok(s.into())
}
fn main() {
if let Err(e) = submain() {
eprintln!("Error: {}.", e);
}
}
fn submain() -> Result<(), pico_args::Error> {
let mut args = Arguments::from_env();
let args = AppArgs {
// Checks that optional flag is present.
help: args.contains(["-h", "--help"]),
// Parses a required value that implements `FromStr`.
// Returns an error if not present.
number: args.value_from_str("--number")?,
// Parses an optional value that implements `FromStr`.
opt_number: args.opt_value_from_str("--opt-number")?,
// Parses an optional value from `&str` using a specified function.
width: args.opt_value_from_fn("--width", parse_width)?.unwrap_or(10),
// Parses an optional value from `&OsStr` using a specified function.
input: args.opt_value_from_os_str("--input", parse_path)?,
// Will return all free arguments or an error if any flags are left.
free: args.free()?,
};
println!("{:#?}", args);
Ok(())
}