From ca511de71f5b8c2ac419f1b188658e8c63b67846 Mon Sep 17 00:00:00 2001 From: Kevin K Date: Sun, 12 Jun 2016 21:50:31 -0400 Subject: [PATCH] imp(Aliases): improves readability of asliases in help messages Aliases are now displayed after the help text inside a `[aliases: als1, als2, als3]` style box. Closes #526 Closes #529 --- src/app/help.rs | 26 +++++++++++--------------- src/app/mod.rs | 12 ++++++++++++ src/args/any_arg.rs | 1 + src/args/arg_builder/flag.rs | 3 +++ src/args/arg_builder/option.rs | 3 +++ src/args/arg_builder/positional.rs | 3 +++ 6 files changed, 33 insertions(+), 15 deletions(-) diff --git a/src/app/help.rs b/src/app/help.rs index 7bc64d246ad..0831f225c87 100644 --- a/src/app/help.rs +++ b/src/app/help.rs @@ -461,6 +461,17 @@ impl<'a> Help<'a> { "".into() } }); + } else if let Some(ref aliases) = a.aliases() { + debugln!("Writing aliases"); + return format!(" [aliases: {}]", + if self.color { + aliases.iter() + .map(|v| format!("{}", self.cizer.good(v))) + .collect::>() + .join(", ") + } else { + aliases.join(", ") + }); } else if !self.hide_pv { debugln!("Writing values"); if let Some(ref pv) = a.possible_vals() { @@ -548,21 +559,6 @@ impl<'a> Help<'a> { let mut ord_m = VecMap::new(); for sc in parser.subcommands.iter().filter(|s| !s.p.is_set(AppSettings::Hidden)) { - let sc = if let Some(ref aliases) = sc.p.meta.aliases { - let mut a = App::new(format!("{}|{}", &*sc.p.meta.name, aliases.iter() - .filter(|&&(_, vis)| vis) - .map(|&(n, _)| n) - .collect::>() - .join("|"))); - a = if let Some(about) = sc.p.meta.about { - a.about(about) - } else { - a - }; - a - } else { - sc.clone() - }; let btm = ord_m.entry(sc.p.meta.disp_ord).or_insert(BTreeMap::new()); longest = cmp::max(longest, sc.p.meta.name.len()); btm.insert(sc.p.meta.name.clone(), sc.clone()); diff --git a/src/app/mod.rs b/src/app/mod.rs index ae68caa659e..cf083359349 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -1261,6 +1261,18 @@ impl<'n, 'e> AnyArg<'n, 'e> for App<'n, 'e> { fn longest_filter(&self) -> bool { true } + fn aliases(&self) -> Option> { + if let Some(ref aliases) = self.p.meta.aliases { + let vis_aliases: Vec<_> = aliases.iter().filter_map(|&(n,v)| if v { Some(n) } else {None}).collect(); + if vis_aliases.is_empty() { + None + } else { + Some(vis_aliases) + } + } else { + None + } + } } impl<'n, 'e> fmt::Display for App<'n, 'e> { diff --git a/src/args/any_arg.rs b/src/args/any_arg.rs index 88aee17859b..91ffc7fa15d 100644 --- a/src/args/any_arg.rs +++ b/src/args/any_arg.rs @@ -8,6 +8,7 @@ use args::settings::ArgSettings; pub trait AnyArg<'n, 'e> { fn name(&self) -> &'n str; fn overrides(&self) -> Option<&[&'e str]>; + fn aliases(&self) -> Option>; fn requires(&self) -> Option<&[&'e str]>; fn blacklist(&self) -> Option<&[&'e str]>; fn required_unless(&self) -> Option<&[&'e str]>; diff --git a/src/args/arg_builder/flag.rs b/src/args/arg_builder/flag.rs index 8d998342ee2..fef958fd784 100644 --- a/src/args/arg_builder/flag.rs +++ b/src/args/arg_builder/flag.rs @@ -166,6 +166,9 @@ impl<'n, 'e> AnyArg<'n, 'e> for FlagBuilder<'n, 'e> { fn longest_filter(&self) -> bool { self.long.is_some() } + fn aliases(&self) -> Option> { + None + } } impl<'n, 'e> DispOrder for FlagBuilder<'n, 'e> { diff --git a/src/args/arg_builder/option.rs b/src/args/arg_builder/option.rs index 5e93233d666..4b7c4195415 100644 --- a/src/args/arg_builder/option.rs +++ b/src/args/arg_builder/option.rs @@ -248,6 +248,9 @@ impl<'n, 'e> AnyArg<'n, 'e> for OptBuilder<'n, 'e> { fn longest_filter(&self) -> bool { true } + fn aliases(&self) -> Option> { + None + } } impl<'n, 'e> DispOrder for OptBuilder<'n, 'e> { diff --git a/src/args/arg_builder/positional.rs b/src/args/arg_builder/positional.rs index 6524e600734..8ea881d69d2 100644 --- a/src/args/arg_builder/positional.rs +++ b/src/args/arg_builder/positional.rs @@ -238,6 +238,9 @@ impl<'n, 'e> AnyArg<'n, 'e> for PosBuilder<'n, 'e> { fn longest_filter(&self) -> bool { true } + fn aliases(&self) -> Option> { + None + } } impl<'n, 'e> DispOrder for PosBuilder<'n, 'e> {