From 77f65c79c248a2c3260f2446094b1c92fb06f23b Mon Sep 17 00:00:00 2001 From: Zach Dziura Date: Tue, 23 Jun 2015 12:00:50 +0000 Subject: [PATCH] Fixed bug where the correct usage format wasn't being used. TODO: Fix a spacing issue with the usage display. --- src/lib.rs | 2 +- src/matches.rs | 2 +- src/token.rs | 13 ++++++++++--- src/usage.rs | 11 ++++++++++- src/vars.rs | 5 ++--- tests/main.rs | 23 +++++++++++++++-------- 6 files changed, 39 insertions(+), 17 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index fe38af6..e1e2ca2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -21,6 +21,6 @@ mod token; mod usage; mod vars; -pub use matches::{Matches, matches}; +pub use matches::{Matches, MatchesTrait, matches}; pub use vars::{Vars, vars}; pub use usage::usage; diff --git a/src/matches.rs b/src/matches.rs index cdd98eb..cc4c873 100644 --- a/src/matches.rs +++ b/src/matches.rs @@ -76,7 +76,7 @@ pub fn matches(vars: &mut Vars, env_args: &[String]) -> Result { } } -trait MatchesTrait { +pub trait MatchesTrait { fn get(&self, arg: &str) -> Option<&String>; fn has_match(&self, arg: &str) -> bool; diff --git a/src/token.rs b/src/token.rs index efe89f2..3eee0c2 100644 --- a/src/token.rs +++ b/src/token.rs @@ -119,7 +119,7 @@ impl Token { } else if !self.short_name.is_empty() { self.short_name.clone() } else { - String::new() + self.description.clone() } } @@ -166,10 +166,17 @@ impl Display for Token { spacing.push(' '); } + let short_name_empty = self.short_name.is_empty(); + let long_name_empty = self.long_name.is_empty(); + let repr = if self.is_group { - format!("{}:", self.description) - } else { + format!("\n{}:", self.description) + } else if !short_name_empty && !long_name_empty { format!(" -{}, --{}{} {}", self.short_name, self.long_name, spacing, self.description) + } else if short_name_empty && !long_name_empty { + format!(" --{}{} {}", self.long_name, spacing, self.description) + } else { + format!(" -{}{} {}", self.short_name, spacing, self.description) }; write!(f, "{}", repr) diff --git a/src/usage.rs b/src/usage.rs index ece22fd..05ba9c8 100644 --- a/src/usage.rs +++ b/src/usage.rs @@ -18,7 +18,16 @@ use vars::Vars; pub fn usage(vars: &Vars) { + print!("Usage: {} ", vars.program_name); + + for token in vars.tokens() { + if let Some(usage) = token.usage() { + print!("{} ", usage); + } + } + + println!("\nOptions:"); for token in vars.tokens() { println!("{}", token); } -} \ No newline at end of file +} diff --git a/src/vars.rs b/src/vars.rs index 90131f2..3b6184b 100644 --- a/src/vars.rs +++ b/src/vars.rs @@ -55,7 +55,6 @@ pub fn vars(program_name: &str, options: &[&str]) -> Result { } 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; @@ -81,8 +80,8 @@ pub fn vars(program_name: &str, options: &[&str]) -> Result { }; tokens.push(help_token); - opts.insert(String::from("-h"), index); - opts.insert(String::from("--help"), index); + opts.insert(String::from("h"), index); + opts.insert(String::from("help"), index); Ok(Vars { opts: opts, diff --git a/tests/main.rs b/tests/main.rs index 58789f6..9752730 100644 --- a/tests/main.rs +++ b/tests/main.rs @@ -2,25 +2,32 @@ extern crate pirate; use std::env; -use pirate::{matches, vars}; +use pirate::{Matches, MatchesTrait, matches, usage, vars}; fn main() { let env_args: Vec = env::args().collect(); - let opts = vec!["o/opt(An option)", "a(Argument):"]; - let mut vars = vars("A Test Program", &opts).unwrap(); + let opts = vec!["o/opt(An option)", "a(An Argument):"]; + let mut vars = vars("test", &opts).unwrap(); - let matches = match matches(&mut vars, &env_args) { + let matches: Matches = match matches(&mut vars, &env_args) { Ok(m) => m, Err(why) => panic!("An error occurred: {}", why) }; - if matches.has_match("a") { - let m = matches.get("a").unwrap(); - println!("{}", m); + if matches.has_match("help") { + usage(&vars); + return; } - + + let arg = match matches.get("a") { + Some(a) => a.clone(), + None => String::from("Pickle") + }; + match matches.get("opt") { Some(_) => println!("Opt was passed to the program"), None => println!("Opt was not passed to the program") } + + println!("{}", arg); }