Commit

Merge main into main

# Conflicts: # src/lib.rs

g1t agentcommitted Parentsa9825fcbd01d15Browse files
3 files+56−150/3 viewed
+7−0
99
1010 With no name it greets whoever is signed in.
1111
12+Use `--lang` to pick a language: `en` (default), `es` or `fr`.
13+
14+```sh
15+$ cargo run -- --lang es Ana
16+¡Hola, Ana!
17+```
18+
1219 ## Develop
1320
1421 ```sh
+24−12
11 //! Greetings.
22
3−/// The greeting for `name`.
4−pub fn greeting(name: &str) -> String {
5− let trimmed = name.trim();
6− let display_name = if trimmed.is_empty() { "world" } else { trimmed };
7− format!("Hello, {display_name}!")
3+/// Languages that can be greeted in, as accepted by `--lang`.
4+pub const LANGUAGES: [&str; 3] = ["en", "es", "fr"];
5+
6+/// The greeting for `name` in the language `lang`.
7+///
8+/// Returns an error naming the supported languages if `lang` is unknown.
9+pub fn greeting(name: &str, lang: &str) -> Result<String, String> {
10+ match lang {
11+ "en" => Ok(format!("Hello, {name}!")),
12+ "es" => Ok(format!("¡Hola, {name}!")),
13+ "fr" => Ok(format!("Bonjour, {name} !")),
14+ _ => Err(format!(
15+ "unsupported language '{lang}' (supported: {})",
16+ LANGUAGES.join(", ")
17+ )),
18+ }
819 }
920
1021 #[cfg(test)]
1324
1425 #[test]
1526 fn greets_by_name() {
16− assert_eq!(greeting("Ada"), "Hello, Ada!");
27+ assert_eq!(greeting("Ada", "en").unwrap(), "Hello, Ada!");
1728 }
1829
1930 #[test]
20− fn greets_world_with_empty_string() {
21− assert_eq!(greeting(""), "Hello, world!");
31+ fn greets_in_spanish() {
32+ assert_eq!(greeting("Ana", "es").unwrap(), "¡Hola, Ana!");
2233 }
2334
2435 #[test]
25− fn greets_world_with_whitespace_only() {
26− assert_eq!(greeting(" "), "Hello, world!");
36+ fn greets_in_french() {
37+ assert_eq!(greeting("Luc", "fr").unwrap(), "Bonjour, Luc !");
2738 }
2839
2940 #[test]
30− fn trims_whitespace_from_name() {
31− assert_eq!(greeting(" Ada "), "Hello, Ada!");
41+ fn rejects_unknown_language() {
42+ let err = greeting("Ada", "de").unwrap_err();
43+ assert!(err.contains("en, es, fr"));
3244 }
3345 }
+25−3
11 use std::env;
2+use std::process;
23
34 use hello::greeting;
45
56 fn main() {
7+ let mut lang = "en".to_owned();
8+ let mut name = None;
9+ let mut args = env::args().skip(1);
10+ while let Some(arg) = args.next() {
11+ if arg == "--lang" {
12+ lang = args.next().unwrap_or_else(|| {
13+ eprintln!("error: --lang requires a value");
14+ process::exit(2);
15+ });
16+ } else if let Some(value) = arg.strip_prefix("--lang=") {
17+ lang = value.to_owned();
18+ } else if name.is_none() {
19+ name = Some(arg);
20+ }
21+ }
22+
623 // The name given, or whoever is signed in.
7− let name = env::args()
8− .nth(1)
24+ let name = name
925 .or_else(|| env::var("USER").ok())
1026 .unwrap_or_else(|| "world".to_owned());
11− println!("{}", greeting(&name));
27+ match greeting(&name, &lang) {
28+ Ok(text) => println!("{text}"),
29+ Err(err) => {
30+ eprintln!("error: {err}");
31+ process::exit(2);
32+ }
33+ }
1234 }