From d1de4d9431f52f8f5dfc36ad2615a5d167e8d613 Mon Sep 17 00:00:00 2001 From: Zach Dziura Date: Mon, 8 Jun 2015 16:26:12 -0400 Subject: [PATCH] Tokens are now in Opts --- src/lib.rs | 2 +- src/opts.rs | 38 +++++++++++++++++++++++++------------- src/token.rs | 18 ++++++------------ 3 files changed, 32 insertions(+), 26 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 060c0ee..a1c81a2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -16,9 +16,9 @@ */ pub mod errors; -pub mod lexer; pub mod matches; mod opts; +mod token; use std::env::Args; diff --git a/src/opts.rs b/src/opts.rs index 3063cb0..0e0da9d 100644 --- a/src/opts.rs +++ b/src/opts.rs @@ -18,33 +18,45 @@ use std::collections::HashMap; use std::collections::VecDeque; -use lexer; +use errors::Error; +use token::Token; pub struct Opts { pub opts: HashMap, pub args: VecDeque, + tokens: Vec } impl Opts { - pub fn new(options: &[&'static str]) -> Opts { - let opts: Hashmap = HashMap::new(); - let args: VecDeque = VecDeque::new(); + pub fn new(options: &[&str]) -> Result { + let mut opts: Hashmap = HashMap::new(); + let mut args: VecDeque = VecDeque::new(); + let mut tokens: Vec = Vec::new(); - for opt in opts.iter() { - if opt.is_arg { - args.push_back(String::from(opt.name())); - } else { - opts.insert(String::from(opt.name()), opt.has_arg); - } + for opt in options.iter() { + let token = match Token::new(opt) { + Ok(t) => t, + Err(why) => return Err(why) + }; + + if !token.is_group { + if token.is_arg { + args.push_back(String::from(token.name())); + } else { + opts.insert(String::from(token.name()), token.has_arg); + } + } + tokens.push(token); } opts.insert(String::from("-h", false)); opts.insert(String::from("--help", false)); - Opts { + Ok(Opts { opts: opts, - args: args - } + args: args, + tokens: tokens + }) } pub fn get_opt(&self, opt_name: &String) -> Option<&bool> { diff --git a/src/token.rs b/src/token.rs index d7d1043..e45d1d6 100644 --- a/src/token.rs +++ b/src/token.rs @@ -31,7 +31,7 @@ pub struct Token { } impl Token { - pub fn new(input: &str, padding: usize) -> Result { + pub fn new(input: &str) -> Result { let mut short_name = String::new(); let mut long_name = String::new(); let mut description = String::new(); @@ -88,7 +88,7 @@ impl Token { has_arg: has_arg, is_group: is_group, description: description, - padding: padding + padding: 0 }) } @@ -101,15 +101,9 @@ impl Token { "" } } - - pub fn fmt_with_padding(&self, padding: usize) -> String { - let mut name = format!("-{}, --{}", self.short_name, self.long_name); - - for _ in 0..padding { - name.push(' '); - } - - name + + pub fn adjust_padding(&self, padding: usize) { + self.padding = padding; } } @@ -123,7 +117,7 @@ impl Display for Token { let repr = if self.is_group { format!("{}:", self.description) } else { - format!("-{}, --{}{}{}", self.short_name, self.long_name, spacing self.description) + format!(" -{}, --{}{}{}", self.short_name, self.long_name, spacing self.description) }; write!(f, "{}", repr)