diff options
Diffstat (limited to 'rustlings/exercises/13_error_handling')
6 files changed, 18 insertions, 9 deletions
diff --git a/rustlings/exercises/13_error_handling/errors1.rs b/rustlings/exercises/13_error_handling/errors1.rs index e07fddc..b9b9bd5 100644 --- a/rustlings/exercises/13_error_handling/errors1.rs +++ b/rustlings/exercises/13_error_handling/errors1.rs @@ -4,12 +4,11 @@ // 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> { +fn generate_nametag_text(name: String) -> Result<String, String> { if name.is_empty() { - // Empty names aren't allowed - None + Err(String::from("Empty names aren't allowed")) } else { - Some(format!("Hi! My name is {name}")) + Ok(format!("Hi! My name is {name}")) } } diff --git a/rustlings/exercises/13_error_handling/errors2.rs b/rustlings/exercises/13_error_handling/errors2.rs index defe359..3d850f7 100644 --- a/rustlings/exercises/13_error_handling/errors2.rs +++ b/rustlings/exercises/13_error_handling/errors2.rs @@ -21,7 +21,7 @@ fn total_cost(item_quantity: &str) -> Result<i32, ParseIntError> { let cost_per_item = 5; // TODO: Handle the error case as described above. - let qty = item_quantity.parse::<i32>(); + let qty = item_quantity.parse::<i32>()?; Ok(qty * cost_per_item + processing_fee) } diff --git a/rustlings/exercises/13_error_handling/errors3.rs b/rustlings/exercises/13_error_handling/errors3.rs index 8e8c38a..bf21bbc 100644 --- a/rustlings/exercises/13_error_handling/errors3.rs +++ b/rustlings/exercises/13_error_handling/errors3.rs @@ -15,7 +15,7 @@ fn total_cost(item_quantity: &str) -> Result<i32, ParseIntError> { // TODO: Fix the compiler error by changing the signature and body of the // `main` function. -fn main() { +fn main() -> Result<(), ParseIntError> { let mut tokens = 100; let pretend_user_input = "8"; @@ -28,4 +28,6 @@ fn main() { tokens -= cost; println!("You now have {tokens} tokens."); } + + Ok(()) } diff --git a/rustlings/exercises/13_error_handling/errors4.rs b/rustlings/exercises/13_error_handling/errors4.rs index 144fce7..e5f3d39 100644 --- a/rustlings/exercises/13_error_handling/errors4.rs +++ b/rustlings/exercises/13_error_handling/errors4.rs @@ -11,6 +11,12 @@ impl PositiveNonzeroInteger { fn new(value: i64) -> Result<Self, CreationError> { // TODO: This function shouldn't always return an `Ok`. // Read the tests below to clarify what should be returned. + if value < 0 { + return Err(CreationError::Negative); + } + if value == 0 { + return Err(CreationError::Zero); + } Ok(Self(value as u64)) } } diff --git a/rustlings/exercises/13_error_handling/errors5.rs b/rustlings/exercises/13_error_handling/errors5.rs index 125779b..405f0dc 100644 --- a/rustlings/exercises/13_error_handling/errors5.rs +++ b/rustlings/exercises/13_error_handling/errors5.rs @@ -48,7 +48,7 @@ impl PositiveNonzeroInteger { // TODO: Add the correct return type `Result<(), Box<dyn ???>>`. What can we // use to describe both errors? Is there a trait which both errors implement? -fn main() { +fn main() -> Result<(), Box<dyn Error>> { let pretend_user_input = "42"; let x: i64 = pretend_user_input.parse()?; println!("output={:?}", PositiveNonzeroInteger::new(x)?); diff --git a/rustlings/exercises/13_error_handling/errors6.rs b/rustlings/exercises/13_error_handling/errors6.rs index b1995e0..353b50b 100644 --- a/rustlings/exercises/13_error_handling/errors6.rs +++ b/rustlings/exercises/13_error_handling/errors6.rs @@ -25,7 +25,9 @@ impl ParsePosNonzeroError { } // TODO: Add another error conversion function here. - // fn from_parse_int(???) -> Self { ??? } + fn from_parse_int(err: ParseIntError) -> Self { + Self::ParseInt(err) + } } #[derive(PartialEq, Debug)] @@ -43,7 +45,7 @@ impl PositiveNonzeroInteger { fn parse(s: &str) -> Result<Self, ParsePosNonzeroError> { // TODO: change this to return an appropriate error instead of panicking // when `parse()` returns an error. - let x: i64 = s.parse().unwrap(); + let x: i64 = s.parse().map_err(ParsePosNonzeroError::from_parse_int)?; Self::new(x).map_err(ParsePosNonzeroError::from_creation) } } |