44#![ warn( clippy:: needless_borrow) ]
55#![ warn( clippy:: redundant_clone) ]
66
7- use std:: collections:: BTreeSet ;
7+ use std:: collections:: { BTreeMap , BTreeSet } ;
88use std:: env;
99use std:: fs;
1010use std:: path:: { Path , PathBuf } ;
@@ -111,6 +111,14 @@ fn list_commands(config: &Config) -> BTreeSet<CommandInfo> {
111111 commands
112112}
113113
114+ /// List all runnable aliases
115+ fn list_aliases ( config : & Config ) -> Vec < String > {
116+ match config. get :: < BTreeMap < String , String > > ( "alias" ) {
117+ Ok ( aliases) => aliases. keys ( ) . map ( |a| a. to_string ( ) ) . collect ( ) ,
118+ Err ( _) => Vec :: new ( ) ,
119+ }
120+ }
121+
114122fn execute_external_subcommand ( config : & Config , cmd : & str , args : & [ & str ] ) -> CliResult {
115123 let command_exe = format ! ( "cargo-{}{}" , cmd, env:: consts:: EXE_SUFFIX ) ;
116124 let path = search_directories ( config)
@@ -120,8 +128,13 @@ fn execute_external_subcommand(config: &Config, cmd: &str, args: &[&str]) -> Cli
120128 let command = match path {
121129 Some ( command) => command,
122130 None => {
123- let cmds = list_commands ( config) ;
124- let did_you_mean = closest_msg ( cmd, cmds. iter ( ) , |c| c. name ( ) ) ;
131+ let commands: Vec < String > = list_commands ( config)
132+ . iter ( )
133+ . map ( |c| c. name ( ) . to_string ( ) )
134+ . collect ( ) ;
135+ let aliases = list_aliases ( config) ;
136+ let suggestions = commands. iter ( ) . chain ( aliases. iter ( ) ) ;
137+ let did_you_mean = closest_msg ( cmd, suggestions, |c| c) ;
125138 let err = failure:: format_err!( "no such subcommand: `{}`{}" , cmd, did_you_mean) ;
126139 return Err ( CliError :: new ( err, 101 ) ) ;
127140 }
0 commit comments