g1t

Greets people from the command line. The sample repository for g1t.

Greet in Spanish and French #7

Opensyntaqx wants to merge into maing1t-agenton g1t
For issueGreet in Spanish and French#21 of 2 pull requests

Other work is changing the same files

Whichever merges second will have to catch up, and may conflict.

3 files changed+56−15
README.md+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
src/lib.rs+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 }
src/main.rs+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 }