Fixed bug where the correct usage format wasn't being used.

TODO: Fix a spacing issue with the usage display.
This commit is contained in:
Zach Dziura 2015-06-23 12:00:50 +00:00
parent 3c9dae504b
commit 77f65c79c2
6 changed files with 39 additions and 17 deletions

View file

@ -21,6 +21,6 @@ mod token;
mod usage; mod usage;
mod vars; mod vars;
pub use matches::{Matches, matches}; pub use matches::{Matches, MatchesTrait, matches};
pub use vars::{Vars, vars}; pub use vars::{Vars, vars};
pub use usage::usage; pub use usage::usage;

View file

@ -76,7 +76,7 @@ pub fn matches(vars: &mut Vars, env_args: &[String]) -> Result<Matches, Error> {
} }
} }
trait MatchesTrait { pub trait MatchesTrait {
fn get(&self, arg: &str) -> Option<&String>; fn get(&self, arg: &str) -> Option<&String>;
fn has_match(&self, arg: &str) -> bool; fn has_match(&self, arg: &str) -> bool;

View file

@ -119,7 +119,7 @@ impl Token {
} else if !self.short_name.is_empty() { } else if !self.short_name.is_empty() {
self.short_name.clone() self.short_name.clone()
} else { } else {
String::new() self.description.clone()
} }
} }
@ -166,10 +166,17 @@ impl Display for Token {
spacing.push(' '); 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 { let repr = if self.is_group {
format!("{}:", self.description) format!("\n{}:", self.description)
} else { } else if !short_name_empty && !long_name_empty {
format!(" -{}, --{}{} {}", self.short_name, self.long_name, spacing, self.description) 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) write!(f, "{}", repr)

View file

@ -18,7 +18,16 @@
use vars::Vars; use vars::Vars;
pub fn usage(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() { for token in vars.tokens() {
println!("{}", token); println!("{}", token);
} }
} }

View file

@ -55,7 +55,6 @@ pub fn vars(program_name: &str, options: &[&str]) -> Result<Vars, Error> {
} }
let token_len = token.len(); let token_len = token.len();
println!("Token {} length: {}", token.name(), token_len);
if token_len > 0 { if token_len > 0 {
if token_len > longest_token_len { if token_len > longest_token_len {
longest_token_len = token_len; longest_token_len = token_len;
@ -81,8 +80,8 @@ pub fn vars(program_name: &str, options: &[&str]) -> Result<Vars, Error> {
}; };
tokens.push(help_token); tokens.push(help_token);
opts.insert(String::from("-h"), index); opts.insert(String::from("h"), index);
opts.insert(String::from("--help"), index); opts.insert(String::from("help"), index);
Ok(Vars { Ok(Vars {
opts: opts, opts: opts,

View file

@ -2,25 +2,32 @@ extern crate pirate;
use std::env; use std::env;
use pirate::{matches, vars}; use pirate::{Matches, MatchesTrait, matches, usage, vars};
fn main() { fn main() {
let env_args: Vec<String> = env::args().collect(); let env_args: Vec<String> = env::args().collect();
let opts = vec!["o/opt(An option)", "a(Argument):"]; let opts = vec!["o/opt(An option)", "a(An Argument):"];
let mut vars = vars("A Test Program", &opts).unwrap(); 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, Ok(m) => m,
Err(why) => panic!("An error occurred: {}", why) Err(why) => panic!("An error occurred: {}", why)
}; };
if matches.has_match("a") { if matches.has_match("help") {
let m = matches.get("a").unwrap(); usage(&vars);
println!("{}", m); return;
} }
let arg = match matches.get("a") {
Some(a) => a.clone(),
None => String::from("Pickle")
};
match matches.get("opt") { match matches.get("opt") {
Some(_) => println!("Opt was passed to the program"), Some(_) => println!("Opt was passed to the program"),
None => println!("Opt was not passed to the program") None => println!("Opt was not passed to the program")
} }
println!("{}", arg);
} }