summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--exercises/13_error_handling/errors1.rs30
-rw-r--r--rustlings-macros/info.toml4
-rw-r--r--solutions/13_error_handling/errors1.rs36
3 files changed, 52 insertions, 18 deletions
diff --git a/exercises/13_error_handling/errors1.rs b/exercises/13_error_handling/errors1.rs
index e3e0482..6d9701b 100644
--- a/exercises/13_error_handling/errors1.rs
+++ b/exercises/13_error_handling/errors1.rs
@@ -1,22 +1,22 @@
-// This function refuses to generate text to be printed on a nametag if you pass
-// it an empty string. It'd be nicer if it explained what the problem was,
-// instead of just sometimes returning `None`. Thankfully, Rust has a similar
-// construct to `Option` that can be used to express error conditions. Let's use
-// it!
-
-fn main() {
- // You can optionally experiment here.
-}
-
+// TODO: This function refuses to generate text to be printed on a nametag if
+// you pass it an empty string. It'd be nicer if it explained what the problem
+// was instead of just returning `None`. Thankfully, Rust has a similar
+// construct to `Option` that can be used to express error conditions. Change
+// the function signature and body to return `Result<String, String>` instead
+// of `Option<String>`.
fn generate_nametag_text(name: String) -> Option<String> {
if name.is_empty() {
// Empty names aren't allowed.
None
} else {
- Some(format!("Hi! My name is {}", name))
+ Some(format!("Hi! My name is {name}"))
}
}
+fn main() {
+ // You can optionally experiment here.
+}
+
#[cfg(test)]
mod tests {
use super::*;
@@ -24,17 +24,17 @@ mod tests {
#[test]
fn generates_nametag_text_for_a_nonempty_name() {
assert_eq!(
- generate_nametag_text("Beyoncé".into()),
- Ok("Hi! My name is Beyoncé".into())
+ generate_nametag_text("Beyoncé".to_string()).as_deref(),
+ Ok("Hi! My name is Beyoncé"),
);
}
#[test]
fn explains_why_generating_nametag_text_fails() {
assert_eq!(
- generate_nametag_text("".into()),
+ generate_nametag_text(String::new()).as_deref(),
// Don't change this line
- Err("`name` was empty; it must be nonempty.".into())
+ Err("`name` was empty; it must be nonempty."),
);
}
}
diff --git a/rustlings-macros/info.toml b/rustlings-macros/info.toml
index 5a47c85..3d8da58 100644
--- a/rustlings-macros/info.toml
+++ b/rustlings-macros/info.toml
@@ -647,8 +647,8 @@ is that `generate_nametag_text` should return a `Result` instead of an `Option`.
To make this change, you'll need to:
- update the return type in the function signature to be a `Result<String,
String>` that could be the variants `Ok(String)` and `Err(String)`
- - change the body of the function to return `Ok(stuff)` where it currently
- returns `Some(stuff)`
+ - change the body of the function to return `Ok(…)` where it currently
+ returns `Some(…)`
- change the body of the function to return `Err(error message)` where it
currently returns `None`"""
diff --git a/solutions/13_error_handling/errors1.rs b/solutions/13_error_handling/errors1.rs
index 4e18198..2a13bfd 100644
--- a/solutions/13_error_handling/errors1.rs
+++ b/solutions/13_error_handling/errors1.rs
@@ -1 +1,35 @@
-// Solutions will be available before the stable release. Thank you for testing the beta version 🥰
+fn generate_nametag_text(name: String) -> Result<String, String> {
+ // ^^^^^^ ^^^^^^
+ if name.is_empty() {
+ // `Err(String)` instead of `None`.
+ Err("Empty names aren't allowed".to_string())
+ } else {
+ // `Ok` instead of `Some`.
+ Ok(format!("Hi! My name is {name}"))
+ }
+}
+
+fn main() {
+ // You can optionally experiment here.
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn generates_nametag_text_for_a_nonempty_name() {
+ assert_eq!(
+ generate_nametag_text("Beyoncé".to_string()).as_deref(),
+ Ok("Hi! My name is Beyoncé"),
+ );
+ }
+
+ #[test]
+ fn explains_why_generating_nametag_text_fails() {
+ assert_eq!(
+ generate_nametag_text(String::new()).as_deref(),
+ Err("`name` was empty; it must be nonempty."),
+ );
+ }
+}