[−][src]Function getopt::getopt
pub fn getopt(
args: &[String],
optstring: &str,
state: &mut State
) -> Result<Opt>
Returns the next option character, if any.
Returns an error if an unexpected option is encountered or if an expected argument is not found.
Parsing stops at the first non-hyphenated argument; or at the first argument matching "-"; or after the first argument matching "--".
When no more options are available, getopt
returns Opt(None, None)
.
Examples
"-"
use getopt::prelude::*; // args = ["program", "-", "-a"]; let optstring = "a"; let mut state = State::new(); assert_eq!(Opt(None, None), getopt(&args, optstring, &mut state)?); assert_eq!("-", args[state.index]);
"--"
use getopt::prelude::*; // args = ["program", "--", "-a"]; let optstring = "a"; let mut state = State::new(); assert_eq!(Opt(None, None), getopt(&args, optstring, &mut state)?); assert_eq!("-a", args[state.index]);
Unexpected option:
use getopt::prelude::*; // args = ["program", "-b"]; let optstring = "a"; let mut state = State::new(); assert_eq!( "unknown option -- b".to_string(), getopt(&args, optstring, &mut state) .unwrap_err() .to_string() );
Missing argument:
use getopt::prelude::*; // args = ["program", "-a"]; let optstring = "a:"; let mut state = State::new(); assert_eq!( "option requires an argument -- a".to_string(), getopt(&args, optstring, &mut state) .unwrap_err() .to_string() );
A simple example:
use getopt::prelude::*; // args = ["program", "-abc", "foo"]; let optstring = "ab:c"; let mut state = State::new(); assert_eq!(Opt(Some('a'), None), getopt(&args, optstring, &mut state)?); assert_eq!(State { index: 1, point: 2 }, state); assert_eq!( Opt(Some('b'), Some("c".to_string())), getopt(&args, optstring, &mut state)? ); assert_eq!(State { index: 2, point: 0 }, state); assert_eq!(Opt(None, None), getopt(&args, optstring, &mut state)?); assert_eq!(State { index: 2, point: 0 }, state); assert_eq!("foo", args[state.index]);
A more realistic example:
use getopt::prelude::*; // args = ["program", "-abc", "-d", "foo", "-e", "bar"]; let optstring = "ab:cd:e"; let mut state = State::new(); let mut a_flag = false; let mut b_flag = String::new(); let mut c_flag = false; let mut d_flag = String::new(); let mut e_flag = false; loop { match getopt(&args, optstring, &mut state)? { Opt(None, _) => break, Opt(Some('a'), None) => a_flag = true, Opt(Some('b'), Some(arg)) => b_flag = arg.clone(), Opt(Some('c'), None) => c_flag = true, Opt(Some('d'), Some(arg)) => d_flag = arg.clone(), Opt(Some('e'), None) => e_flag = true, _ => unreachable!(), } } let args = args.split_off(state.index); assert_eq!(true, a_flag); assert_eq!("c", b_flag); assert_eq!(false, c_flag); assert_eq!("foo", d_flag); assert_eq!(true, e_flag); assert_eq!(1, args.len()); assert_eq!("bar", args.first().unwrap());