]> git.proxmox.com Git - cargo.git/commitdiff
Reformat main::list_commands to return CommandInfo over a tuple
authorDale Wijnand <dale.wijnand@gmail.com>
Thu, 26 Jul 2018 10:29:47 +0000 (11:29 +0100)
committerDale Wijnand <dale.wijnand@gmail.com>
Thu, 26 Jul 2018 11:06:50 +0000 (12:06 +0100)
src/bin/cargo/cli.rs
src/bin/cargo/command_prelude.rs
src/bin/cargo/main.rs

index cfa0a3a66da656d269a22e443a50524b705f9b69..85990c8f0cac25bfde9f7c123e0bf8497b2c8a37 100644 (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(());
index fa49bea86398ecac927bb869cfb454a0f5d70bd3..59aef526da73e35648f2650c72810aa0ae549b6c 100644 (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(),
+        }
+    }
+}
index 76efc09094cc91f55394f86a4ee5d289583979ea..f2bf93bc95a331400c1c1f077f870d40e58786b2 100644 (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)