Reformat main::list_commands to return CommandInfo over a tuple

This commit is contained in:
Dale Wijnand 2018-07-26 11:29:47 +01:00
parent cef7c5667c
commit c3422cfc40
No known key found for this signature in database
GPG Key ID: 4F256E3D151DF5EF
3 changed files with 37 additions and 14 deletions

View File

@ -69,14 +69,17 @@ Run with 'cargo -Z [FLAG] [SUBCOMMAND]'"
if args.is_present("list") {
println!("Installed Commands:");
for command in list_commands(config) {
let (command, path) = command;
if is_verbose {
match path {
Some(p) => println!(" {:<20} {}", command, p),
None => println!(" {:<20}", command),
match command {
CommandInfo::BuiltIn { name } => {
println!(" {:<20} {}", name)
}
CommandInfo::External { name, path } => {
if is_verbose {
println!(" {:<20} {}", name, path.display())
} else {
println!(" {:<20}", name)
}
}
} else {
println!(" {}", command);
}
}
return Ok(());

View File

@ -411,3 +411,18 @@ pub fn values(args: &ArgMatches, name: &str) -> Vec<String> {
.map(|s| s.to_string())
.collect()
}
#[derive(PartialEq, PartialOrd, Eq, Ord)]
pub enum CommandInfo {
BuiltIn { name: String },
External { name: String, path: PathBuf },
}
impl CommandInfo {
pub fn name(&self) -> String {
match self {
CommandInfo::BuiltIn { name, .. } => name.to_string(),
CommandInfo::External { name, .. } => name.to_string(),
}
}
}

View File

@ -26,6 +26,8 @@ mod cli;
mod command_prelude;
mod commands;
use command_prelude::*;
fn main() {
env_logger::init();
cargo::core::maybe_allow_nightly_features();
@ -81,7 +83,7 @@ fn aliased_command(config: &Config, command: &str) -> CargoResult<Option<Vec<Str
}
/// List all runnable commands
fn list_commands(config: &Config) -> BTreeSet<(String, Option<String>)> {
fn list_commands(config: &Config) -> BTreeSet<CommandInfo> {
let prefix = "cargo-";
let suffix = env::consts::EXE_SUFFIX;
let mut commands = BTreeSet::new();
@ -101,16 +103,18 @@ fn list_commands(config: &Config) -> BTreeSet<(String, Option<String>)> {
}
if is_executable(entry.path()) {
let end = filename.len() - suffix.len();
commands.insert((
filename[prefix.len()..end].to_string(),
Some(path.display().to_string()),
));
commands.insert(CommandInfo::External {
name: filename[prefix.len()..end].to_string(),
path: path.clone(),
});
}
}
}
for cmd in commands::builtin() {
commands.insert((cmd.get_name().to_string(), None));
commands.insert(CommandInfo::BuiltIn {
name: cmd.get_name().to_string(),
});
}
commands
@ -121,7 +125,8 @@ fn find_closest(config: &Config, cmd: &str) -> Option<String> {
// Only consider candidates with a lev_distance of 3 or less so we don't
// suggest out-of-the-blue options.
cmds.into_iter()
.map(|(c, _)| (lev_distance(&c, cmd), c))
.map(|c| c.name())
.map(|c| (lev_distance(&c, cmd), c))
.filter(|&(d, _)| d < 4)
.min_by_key(|a| a.0)
.map(|slot| slot.1)