diff --git a/src/matches.rs b/src/matches.rs index ee0952b..cdd98eb 100644 --- a/src/matches.rs +++ b/src/matches.rs @@ -21,19 +21,15 @@ use std::collections::hash_map::Keys; use errors::{Error, ErrorKind}; use vars::Vars; -pub struct Matches { - matches: HashMap -} +pub type Matches = HashMap; pub fn matches(vars: &mut Vars, env_args: &[String]) -> Result { - let mut matches: HashMap = HashMap::new(); + let mut matches: Matches = HashMap::new(); let mut args = env_args.iter(); args.next(); // Remove the program name - let mut next_arg = args.next(); - while next_arg.is_some() { - let mut current_arg = next_arg.unwrap(); + while let Some(mut current_arg) = args.next() { let mut arg_vec: Vec = Vec::new(); // Determine if current opt is in short, long, or arg form @@ -72,28 +68,34 @@ pub fn matches(vars: &mut Vars, env_args: &[String]) -> Result { let arg = vars.get_arg().unwrap(); matches.insert(arg.name(), current_arg.clone()); } - - next_arg = args.next(); } match vars.arg_len() { - 0 => Ok(Matches { matches: matches }), + 0 => Ok( matches ), _ => Err(Error::new(ErrorKind::MissingArgument, vars.get_arg().unwrap().name())), } } -impl Matches { - pub fn get(&self, arg: &str) -> Option<&String> { - self.matches.get(arg) +trait MatchesTrait { + fn get(&self, arg: &str) -> Option<&String>; + + fn has_match(&self, arg: &str) -> bool; + + fn matches(&self) -> Keys; +} + +impl MatchesTrait for Matches { + fn get(&self, arg: &str) -> Option<&String> { + self.get(arg) } - pub fn has_match(&self, arg: &str) -> bool { + fn has_match(&self, arg: &str) -> bool { let arg = String::from(arg); - self.matches.contains_key(&arg) + self.contains_key(&arg) } - pub fn matches(&self) -> Keys { - self.matches.keys() + fn matches(&self) -> Keys { + self.keys() } } diff --git a/src/vars.rs b/src/vars.rs index 7881e1d..90131f2 100644 --- a/src/vars.rs +++ b/src/vars.rs @@ -22,17 +22,18 @@ use errors::Error; use token::{Token, token}; pub struct Vars { - opts: HashMap, - args: VecDeque, - pub tokens: Vec, + tokens: Vec, + opts: HashMap, + args: VecDeque, pub program_name: String } pub fn vars(program_name: &str, options: &[&str]) -> Result { - let mut opts: HashMap = HashMap::new(); - let mut args: VecDeque = VecDeque::new(); let mut tokens: Vec = Vec::new(); + let mut opts: HashMap = HashMap::new(); + let mut args: VecDeque = VecDeque::new(); let mut longest_token_len: usize = 0; + let mut index: usize = 0; for opt in options.iter() { let token = match token(opt) { @@ -42,18 +43,19 @@ pub fn vars(program_name: &str, options: &[&str]) -> Result { if !token.is_group { if token.is_arg { - args.push_back(token.clone()); + args.push_back(index); } else { if !token.short_name.is_empty() { - opts.insert(token.short_name.clone(), token.clone()); + opts.insert(token.short_name.clone(), index); } if !token.long_name.is_empty() { - opts.insert(token.long_name.clone(), token.clone()); + opts.insert(token.long_name.clone(), index); } } let token_len = token.len(); + println!("Token {} length: {}", token.name(), token_len); if token_len > 0 { if token_len > longest_token_len { longest_token_len = token_len; @@ -65,6 +67,7 @@ pub fn vars(program_name: &str, options: &[&str]) -> Result { } } tokens.push(token); + index += 1; } let help_token = Token { @@ -76,9 +79,10 @@ pub fn vars(program_name: &str, options: &[&str]) -> Result { is_group: false, padding: 0 }; - - opts.insert(String::from("-h"), help_token.clone()); - opts.insert(String::from("--help"), help_token.clone()); + + tokens.push(help_token); + opts.insert(String::from("-h"), index); + opts.insert(String::from("--help"), index); Ok(Vars { opts: opts, @@ -89,16 +93,24 @@ pub fn vars(program_name: &str, options: &[&str]) -> Result { } impl Vars { - pub fn get_opt(&self, opt_name: &String) -> Option<&Token> { - self.opts.get(opt_name) + pub fn get_opt(&self, opt_name: &str) -> Option<&Token> { + if let Some(&index) = self.opts.get(opt_name) { + self.tokens.get(index) + } else { + None + } } - pub fn contains_opt(&self, opt: &String) -> bool { + pub fn contains_opt(&self, opt: &str) -> bool { self.opts.contains_key(opt) } - pub fn get_arg(&mut self) -> Option { - self.args.pop_front() + pub fn get_arg(&mut self) -> Option<&Token> { + if let Some(index) = self.args.pop_front() { + self.tokens.get(index) + } else { + None + } } pub fn arg_len(&self) -> usize {