Commit

Greet in Spanish and French

g1t agentcommitted Parent740a7a9Browse files
4 files+72−70/4 viewed
+7−0
1+# This file is automatically @generated by Cargo.
2+# It is not intended for manual editing.
3+version = 4
4+
5+[[package]]
6+name = "hello"
7+version = "0.1.0"
+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
+33−4
11 //! Greetings.
22
3−/// The greeting for `name`.
4−pub fn greeting(name: &str) -> String {
5− format!("Hello, {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+ }
619 }
720
821 #[cfg(test)]
1124
1225 #[test]
1326 fn greets_by_name() {
14− assert_eq!(greeting("Ada"), "Hello, Ada!");
27+ assert_eq!(greeting("Ada", "en").unwrap(), "Hello, Ada!");
28+ }
29+
30+ #[test]
31+ fn greets_in_spanish() {
32+ assert_eq!(greeting("Ana", "es").unwrap(), "¡Hola, Ana!");
33+ }
34+
35+ #[test]
36+ fn greets_in_french() {
37+ assert_eq!(greeting("Luc", "fr").unwrap(), "Bonjour, Luc !");
38+ }
39+
40+ #[test]
41+ fn rejects_unknown_language() {
42+ let err = greeting("Ada", "de").unwrap_err();
43+ assert!(err.contains("en, es, fr"));
1544 }
1645 }
+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 }