4
4
#![ warn( clippy:: needless_borrow) ]
5
5
#![ warn( clippy:: redundant_clone) ]
6
6
7
- use std:: collections:: BTreeSet ;
7
+ use std:: collections:: { BTreeMap , BTreeSet } ;
8
8
use std:: env;
9
9
use std:: fs;
10
10
use std:: path:: { Path , PathBuf } ;
@@ -111,6 +111,14 @@ fn list_commands(config: &Config) -> BTreeSet<CommandInfo> {
111
111
commands
112
112
}
113
113
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
+
114
122
fn execute_external_subcommand ( config : & Config , cmd : & str , args : & [ & str ] ) -> CliResult {
115
123
let command_exe = format ! ( "cargo-{}{}" , cmd, env:: consts:: EXE_SUFFIX ) ;
116
124
let path = search_directories ( config)
@@ -120,8 +128,13 @@ fn execute_external_subcommand(config: &Config, cmd: &str, args: &[&str]) -> Cli
120
128
let command = match path {
121
129
Some ( command) => command,
122
130
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) ;
125
138
let err = failure:: format_err!( "no such subcommand: `{}`{}" , cmd, did_you_mean) ;
126
139
return Err ( CliError :: new ( err, 101 ) ) ;
127
140
}
0 commit comments