mod args; use std::process::ExitCode; fn guess_parser(args: &mut dyn Iterator) -> Box { for arg in args { if arg.len() > 2 && arg.starts_with("--") { // --C.. can only be ShortAndLong return Box::new(args::ShortAndLongParser::new()); } } // TODO: Can we make more guesses? Box::new(args::LongOnlyParser::new()) } fn parse_args() -> Result { let mut options = args::Options::new(); let help_idx = options.push( args::OptionBuilder::default() .short('h') .long("help") .description("display this and exit") .build() .unwrap(), ); let version_idx = options.push( args::OptionBuilder::default() .short('V') .long("version") .description("display version and exit") .build() .unwrap(), ); let verbose_idx = options.push( args::OptionBuilder::default() .long("verbose") .description("be verbose") .build() .unwrap(), ); let parser = guess_parser(&mut std::env::args()); let maybe_args = parser.run(&mut options, &mut std::env::args()); // help is special, check for it even if parser#run returned error. let help = &options[help_idx]; if help.is_set() { parser.print_help(&options); return Ok(true); } let args = maybe_args?; let version = &options[version_idx]; if version.is_set() { println!("Version is 0.0.1"); return Ok(true); } let verbose = &options[verbose_idx]; println!("verbose: {}", verbose.is_set()); println!("args: {:?}", args.args); Ok(false) } fn main() -> ExitCode { match parse_args() { Ok(exit) => { if exit { return ExitCode::SUCCESS; } } Err(msg) => { eprintln!("{}", msg); return ExitCode::FAILURE; } } ExitCode::SUCCESS }