@@ -66,7 +66,7 @@ fn baseopts() -> getopts::Options {
66
66
/*
67
67
* We should always have a --help flag everywhere.
68
68
*/
69
- opts. optflag ( "" , "help" , "usage information" ) ;
69
+ opts. optflag ( "" , "help" , "display usage information" ) ;
70
70
71
71
opts
72
72
}
@@ -2417,8 +2417,19 @@ fn main() -> Result<()> {
2417
2417
hide : true ,
2418
2418
blank : false ,
2419
2419
} ) ;
2420
+ handlers. push ( CommandInfo {
2421
+ name : "help" . into ( ) ,
2422
+ desc : "display usage information" . into ( ) ,
2423
+ /*
2424
+ * No behaviour is required here. The "help" command is a special case
2425
+ * in the argument processing below.
2426
+ */
2427
+ func : |_: & CommandArg | Ok ( ( ) ) ,
2428
+ hide : false ,
2429
+ blank : true ,
2430
+ } ) ;
2420
2431
2421
- let usage = || {
2432
+ let usage = |failure : bool | {
2422
2433
let mut out = String :: new ( ) ;
2423
2434
out += "Usage: helios [OPTIONS] COMMAND [OPTIONS] [ARGS...]\n \n " ;
2424
2435
for ci in handlers. iter ( ) {
@@ -2432,25 +2443,42 @@ fn main() -> Result<()> {
2432
2443
2433
2444
out += & format ! ( " {:<16} {}\n " , ci. name, ci. desc) ;
2434
2445
}
2435
- println ! ( "{}" , opts. usage( & out) ) ;
2446
+ let msg = opts. usage ( & out) ;
2447
+ if failure {
2448
+ eprintln ! ( "{msg}" ) ;
2449
+ } else {
2450
+ println ! ( "{msg}" ) ;
2451
+ }
2452
+ } ;
2453
+
2454
+ let res = match opts. parse ( std:: env:: args_os ( ) . skip ( 1 ) ) {
2455
+ Ok ( res) => res,
2456
+ Err ( e) => {
2457
+ usage ( true ) ;
2458
+ bail ! ( "{e}" ) ;
2459
+ }
2436
2460
} ;
2437
2461
2438
- let res = opts. parse ( std:: env:: args ( ) . skip ( 1 ) ) ?;
2439
2462
if res. opt_present ( "help" ) {
2440
- usage ( ) ;
2463
+ usage ( false ) ;
2441
2464
return Ok ( ( ) ) ;
2442
2465
}
2443
2466
2444
2467
if res. free . is_empty ( ) {
2445
- usage ( ) ;
2468
+ usage ( true ) ;
2446
2469
bail ! ( "choose a command" ) ;
2447
2470
}
2448
2471
2472
+ if res. free [ 0 ] == "help" {
2473
+ usage ( false ) ;
2474
+ return Ok ( ( ) ) ;
2475
+ }
2476
+
2449
2477
let args = res. free [ 1 ..] . iter ( ) . map ( |s| s. as_str ( ) ) . collect :: < Vec < _ > > ( ) ;
2450
2478
2451
2479
let log = init_log ( ) ;
2452
2480
2453
- for ci in handlers {
2481
+ for ci in handlers. iter ( ) {
2454
2482
if ci. name != res. free [ 0 ] {
2455
2483
continue ;
2456
2484
}
@@ -2460,6 +2488,7 @@ fn main() -> Result<()> {
2460
2488
return ( ci. func ) ( & ca) ;
2461
2489
}
2462
2490
2491
+ usage ( true ) ;
2463
2492
bail ! ( "command \" {}\" not understood" , res. free[ 0 ] ) ;
2464
2493
}
2465
2494
0 commit comments