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(());
.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(),
+ }
+ }
+}
mod command_prelude;
mod commands;
+use command_prelude::*;
+
fn main() {
env_logger::init();
cargo::core::maybe_allow_nightly_features();
}
/// 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();
}
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
// 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)