@@ -11,6 +11,7 @@ pub type Result<T> = result::Result<T, Error>;
1111const ARG_PREFIX : & str = "--" ;
1212const ARG_SEPARATOR : & str = "--" ;
1313const HELP_ARG : & str = "--help" ;
14+ const VERSION_ARG : & str = "--version" ;
1415
1516/// Errors associated with parsing and validating arguments.
1617#[ derive( Debug , PartialEq ) ]
@@ -277,6 +278,16 @@ impl<'a> Arguments<'a> {
277278 return Ok ( ( ) ) ;
278279 }
279280
281+ // If `--version` is provided as a parameter, we artificially skip the parsing of other
282+ // command line arguments by adding just the version argument to the parsed list and
283+ // returning.
284+ if args. contains ( & VERSION_ARG . to_string ( ) ) {
285+ let mut version_arg = Argument :: new ( "version" ) . help ( "Print the binary version number." ) ;
286+ version_arg. user_value = Some ( Value :: Bool ( true ) ) ;
287+ self . insert_arg ( version_arg) ;
288+ return Ok ( ( ) ) ;
289+ }
290+
280291 // Otherwise, we continue the parsing of the other arguments.
281292 self . populate_args ( args)
282293 }
@@ -465,9 +476,10 @@ mod tests {
465476 #[ test]
466477 fn test_parse ( ) {
467478 let arg_parser = build_arg_parser ( ) ;
468- let mut arguments = arg_parser. arguments ( ) . clone ( ) ;
469479
470480 // Test different scenarios for the command line arguments provided by user.
481+ let mut arguments = arg_parser. arguments ( ) . clone ( ) ;
482+
471483 let args = vec ! [ "binary-name" , "--exec-file" , "foo" , "--help" ]
472484 . into_iter ( )
473485 . map ( String :: from)
@@ -476,7 +488,16 @@ mod tests {
476488 assert ! ( arguments. parse( & args) . is_ok( ) ) ;
477489 assert ! ( arguments. args. contains_key( "help" ) ) ;
478490
479- let arg_parser = build_arg_parser ( ) ;
491+ arguments = arg_parser. arguments ( ) . clone ( ) ;
492+
493+ let args = vec ! [ "binary-name" , "--exec-file" , "foo" , "--version" ]
494+ . into_iter ( )
495+ . map ( String :: from)
496+ . collect :: < Vec < String > > ( ) ;
497+
498+ assert ! ( arguments. parse( & args) . is_ok( ) ) ;
499+ assert ! ( arguments. args. contains_key( "version" ) ) ;
500+
480501 arguments = arg_parser. arguments ( ) . clone ( ) ;
481502
482503 let args = vec ! [
@@ -496,7 +517,6 @@ mod tests {
496517 Err ( Error :: MissingValue ( "api-sock" . to_string( ) ) )
497518 ) ;
498519
499- let arg_parser = build_arg_parser ( ) ;
500520 arguments = arg_parser. arguments ( ) . clone ( ) ;
501521
502522 let args = vec ! [
@@ -517,7 +537,6 @@ mod tests {
517537 Err ( Error :: DuplicateArgument ( "api-sock" . to_string( ) ) )
518538 ) ;
519539
520- let arg_parser = build_arg_parser ( ) ;
521540 arguments = arg_parser. arguments ( ) . clone ( ) ;
522541
523542 let args = vec ! [ "binary-name" , "--api-sock" , "foo" ]
@@ -530,7 +549,6 @@ mod tests {
530549 Err ( Error :: MissingArgument ( "exec-file" . to_string( ) ) )
531550 ) ;
532551
533- let arg_parser = build_arg_parser ( ) ;
534552 arguments = arg_parser. arguments ( ) . clone ( ) ;
535553
536554 let args = vec ! [
@@ -550,7 +568,6 @@ mod tests {
550568 Err ( Error :: UnexpectedArgument ( "invalid-arg" . to_string( ) ) )
551569 ) ;
552570
553- let arg_parser = build_arg_parser ( ) ;
554571 arguments = arg_parser. arguments ( ) . clone ( ) ;
555572
556573 let args = vec ! [
@@ -572,7 +589,6 @@ mod tests {
572589 Err ( Error :: MissingArgument ( "config-file" . to_string( ) ) )
573590 ) ;
574591
575- let arg_parser = build_arg_parser ( ) ;
576592 arguments = arg_parser. arguments ( ) . clone ( ) ;
577593
578594 let args = vec ! [
@@ -592,7 +608,6 @@ mod tests {
592608 Err ( Error :: MissingValue ( "id" . to_string( ) ) )
593609 ) ;
594610
595- let arg_parser = build_arg_parser ( ) ;
596611 arguments = arg_parser. arguments ( ) . clone ( ) ;
597612
598613 let args = vec ! [
@@ -613,7 +628,6 @@ mod tests {
613628 Err ( Error :: UnexpectedArgument ( "foobar" . to_string( ) ) )
614629 ) ;
615630
616- let arg_parser = build_arg_parser ( ) ;
617631 arguments = arg_parser. arguments ( ) . clone ( ) ;
618632
619633 let args = vec ! [
@@ -633,7 +647,6 @@ mod tests {
633647 Err ( Error :: UnexpectedArgument ( "foobar" . to_string( ) ) )
634648 ) ;
635649
636- let arg_parser = build_arg_parser ( ) ;
637650 arguments = arg_parser. arguments ( ) . clone ( ) ;
638651
639652 let args = vec ! [ "binary-name" , "foo" ]
@@ -646,7 +659,6 @@ mod tests {
646659 Err ( Error :: UnexpectedArgument ( "foo" . to_string( ) ) )
647660 ) ;
648661
649- let arg_parser = build_arg_parser ( ) ;
650662 arguments = arg_parser. arguments ( ) . clone ( ) ;
651663
652664 let args = vec ! [
0 commit comments