@@ -97,9 +97,7 @@ complete -F _{name} {name}
97
97
98
98
fn all_subcommands ( & self ) -> String {
99
99
let mut subcmds = String :: new ( ) ;
100
- let mut scs = get_all_subcommands ( self . p ) ;
101
- scs. sort ( ) ;
102
- scs. dedup ( ) ;
100
+ let scs = get_all_subcommands ( self . p ) ;
103
101
104
102
for sc in & scs {
105
103
subcmds = format ! (
@@ -153,7 +151,14 @@ complete -F _{name} {name}
153
151
let mut p = self . p ;
154
152
for sc in path. split ( "_" ) . skip ( 1 ) {
155
153
debugln ! ( "iter;sc={}" , sc) ;
156
- p = & p. subcommands . iter ( ) . filter ( |s| s. p . meta . name == sc) . next ( ) . unwrap ( ) . p ;
154
+ p = & p. subcommands . iter ( )
155
+ . filter ( |s| s. p . meta . name == sc
156
+ || ( s. p . meta . aliases . is_some ( ) && s. p . meta . aliases . as_ref ( )
157
+ . unwrap ( )
158
+ . iter ( )
159
+ . any ( |& ( n, _) | n==sc ) ) )
160
+ . next ( )
161
+ . unwrap ( ) . p ;
157
162
}
158
163
let mut opts = p. short_list . iter ( ) . fold ( String :: new ( ) , |acc, s| format ! ( "{} -{}" , acc, s) ) ;
159
164
opts = format ! ( "{} {}" , opts, p. long_list. iter( )
@@ -162,14 +167,19 @@ complete -F _{name} {name}
162
167
. fold( String :: new( ) , |acc, p| format!( "{} {}" , acc, p) ) ) ;
163
168
opts = format ! ( "{} {}" , opts, p. subcommands. iter( )
164
169
. fold( String :: new( ) , |acc, s| format!( "{} {}" , acc, s. p. meta. name) ) ) ;
170
+ for sc in & p. subcommands {
171
+ if let Some ( ref aliases) = sc. p . meta . aliases {
172
+ opts = format ! ( "{} {}" , opts, aliases. iter( ) . map( |& ( n, _) | n) . fold( String :: new( ) , |acc, a| format!( "{} {}" , acc, a) ) ) ;
173
+ }
174
+ }
165
175
opts
166
176
}
167
177
168
178
fn option_details_for_path ( & self , path : & str ) -> String {
169
179
let mut p = self . p ;
170
180
for sc in path. split ( "_" ) . skip ( 1 ) {
171
181
debugln ! ( "iter;sc={}" , sc) ;
172
- p = & p. subcommands . iter ( ) . filter ( |s| s. p . meta . name == sc) . next ( ) . unwrap ( ) . p ;
182
+ p = & p. subcommands . iter ( ) . filter ( |s| s. p . meta . name == sc || ( s . p . meta . aliases . is_some ( ) && s . p . meta . aliases . as_ref ( ) . unwrap ( ) . iter ( ) . any ( | & ( n , _ ) | n==sc ) ) ) . next ( ) . unwrap ( ) . p ;
173
183
}
174
184
let mut opts = String :: new ( ) ;
175
185
for o in & p. opts {
@@ -195,31 +205,55 @@ complete -F _{name} {name}
195
205
pub fn get_all_subcommands ( p : & Parser ) -> Vec < String > {
196
206
let mut subcmds = vec ! [ ] ;
197
207
if !p. has_subcommands ( ) {
198
- return vec ! [ p. meta. name. clone( ) ]
208
+ let mut ret = vec ! [ p. meta. name. clone( ) ] ;
209
+ if let Some ( ref aliases) = p. meta . aliases {
210
+ for & ( n, _) in aliases {
211
+ ret. push ( n. to_owned ( ) ) ;
212
+ }
213
+ }
214
+ return ret;
199
215
}
200
- for sc in p. subcommands . iter ( ) . map ( |ref s| s. p . meta . name . clone ( ) ) {
201
- subcmds. push ( sc) ;
216
+ for sc in & p. subcommands {
217
+ if let Some ( ref aliases) = sc. p . meta . aliases {
218
+ for & ( n, _) in aliases {
219
+ subcmds. push ( n. to_owned ( ) ) ;
220
+ }
221
+ }
222
+ subcmds. push ( sc. p . meta . name . clone ( ) ) ;
202
223
}
203
224
for sc_v in p. subcommands . iter ( ) . map ( |ref s| get_all_subcommands ( & s. p ) ) {
204
225
subcmds. extend ( sc_v) ;
205
226
}
227
+ subcmds. sort ( ) ;
228
+ subcmds. dedup ( ) ;
206
229
subcmds
207
230
}
208
231
209
232
pub fn get_all_subcommand_paths ( p : & Parser , first : bool ) -> Vec < String > {
210
233
let mut subcmds = vec ! [ ] ;
211
234
if !p. has_subcommands ( ) {
212
235
if !first {
213
- return vec ! [ p. meta. bin_name. as_ref( ) . unwrap( ) . clone( ) . replace( " " , "_" ) ]
236
+ let name = & * p. meta . name ;
237
+ let path = p. meta . bin_name . as_ref ( ) . unwrap ( ) . clone ( ) . replace ( " " , "_" ) ;
238
+ let mut ret = vec ! [ path. clone( ) ] ;
239
+ if let Some ( ref aliases) = p. meta . aliases {
240
+ for & ( n, _) in aliases {
241
+ ret. push ( path. replace ( name, n) ) ;
242
+ }
243
+ }
244
+ return ret;
214
245
}
215
246
return vec ! [ ] ;
216
247
}
217
- for sc in p. subcommands . iter ( )
218
- . map ( |ref s| s. p . meta . bin_name . as_ref ( )
219
- . unwrap ( )
220
- . clone ( )
221
- . replace ( " " , "_" ) ) {
222
- subcmds. push ( sc) ;
248
+ for sc in & p. subcommands {
249
+ let name = & * sc. p . meta . name ;
250
+ let path = sc. p . meta . bin_name . as_ref ( ) . unwrap ( ) . clone ( ) . replace ( " " , "_" ) ;
251
+ subcmds. push ( path. clone ( ) ) ;
252
+ if let Some ( ref aliases) = sc. p . meta . aliases {
253
+ for & ( n, _) in aliases {
254
+ subcmds. push ( path. replace ( name, n) ) ;
255
+ }
256
+ }
223
257
}
224
258
for sc_v in p. subcommands . iter ( ) . map ( |ref s| get_all_subcommand_paths ( & s. p , false ) ) {
225
259
subcmds. extend ( sc_v) ;
0 commit comments