| 7 | 7 | | pub name: Option<String>, |
| 8 | 8 | | /// Whether to upper-case the greeting (`--shout`). |
| 9 | 9 | | pub shout: bool, |
| 10 | + | /// Whether to print the crate version and exit (`--version`). |
| 11 | + | pub version: bool, |
| 10 | 12 | | } |
| 11 | 13 | | |
| 12 | 14 | | /// Parses command-line arguments (excluding the program name). |
| 13 | 15 | | /// |
| 14 | | − | /// `--shout` sets [`Options::shout`]; other arguments starting with `--` are |
| 16 | + | /// `--shout` sets [`Options::shout`] and `--version` sets |
| 17 | + | /// [`Options::version`]; other arguments starting with `--` are |
| 15 | 18 | | /// treated as flags and skipped. The name is the first remaining argument. |
| 16 | 19 | | pub fn parse_args<I: IntoIterator<Item = String>>(args: I) -> Options { |
| 17 | 20 | | let mut options = Options::default(); |
| 18 | 21 | | for arg in args { |
| 19 | 22 | | if arg == "--shout" { |
| 20 | 23 | | options.shout = true; |
| 24 | + | } else if arg == "--version" { |
| 25 | + | options.version = true; |
| 21 | 26 | | } else if !arg.starts_with("--") && options.name.is_none() { |
| 22 | 27 | | options.name = Some(arg); |
| 23 | 28 | | } |
| ⋯ |
| 97 | 102 | | } |
| 98 | 103 | | |
| 99 | 104 | | #[test] |
| 105 | + | fn parse_args_version_defaults_off() { |
| 106 | + | assert!(!parse_args(args(&["Ada"])).version); |
| 107 | + | } |
| 108 | + | |
| 109 | + | #[test] |
| 110 | + | fn parse_args_version() { |
| 111 | + | let options = parse_args(args(&["--version"])); |
| 112 | + | assert!(options.version); |
| 113 | + | assert_eq!(options.name, None); |
| 114 | + | } |
| 115 | + | |
| 116 | + | #[test] |
| 100 | 117 | | fn shout_upper_cases_greeting() { |
| 101 | 118 | | assert_eq!(shout(&greeting("Ada")), "HELLO, ADA!"); |
| 102 | 119 | | } |