From 2e93a588e0abe8badb7eafafb9e7d073c2be5df8 Mon Sep 17 00:00:00 2001 From: Taylor Yu Date: Sun, 4 Apr 2021 00:04:03 -0500 Subject: [PATCH 1/2] fix: use trait objects for try_from_into Use `Box` to allow solutions to use `?` to propagate errors. In the tests, explicitly check `is_ok()` instead of trying to force the error type to `String` (or other `PartialEq` type) using `assert_eq!()`. --- exercises/conversions/try_from_into.rs | 40 ++++++++++++++------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/exercises/conversions/try_from_into.rs b/exercises/conversions/try_from_into.rs index e405c3f4..c0b5d986 100644 --- a/exercises/conversions/try_from_into.rs +++ b/exercises/conversions/try_from_into.rs @@ -3,6 +3,7 @@ // instead of the target type itself. // You can read more about it at https://doc.rust-lang.org/std/convert/trait.TryFrom.html use std::convert::{TryFrom, TryInto}; +use std::error; #[derive(Debug, PartialEq)] struct Color { @@ -24,19 +25,19 @@ struct Color { // Tuple implementation impl TryFrom<(i16, i16, i16)> for Color { - type Error = String; + type Error = Box; fn try_from(tuple: (i16, i16, i16)) -> Result {} } // Array implementation impl TryFrom<[i16; 3]> for Color { - type Error = String; + type Error = Box; fn try_from(arr: [i16; 3]) -> Result {} } // Slice implementation impl TryFrom<&[i16]> for Color { - type Error = String; + type Error = Box; fn try_from(slice: &[i16]) -> Result {} } @@ -76,41 +77,43 @@ mod tests { } #[test] fn test_tuple_correct() { - let c: Result = (183, 65, 14).try_into(); + let c: Result = (183, 65, 14).try_into(); + assert!(c.is_ok()); assert_eq!( - c, - Ok(Color { + c.unwrap(), + Color { red: 183, green: 65, blue: 14 - }) + } ); } #[test] fn test_array_out_of_range_positive() { - let c: Result = [1000, 10000, 256].try_into(); + let c: Result = [1000, 10000, 256].try_into(); assert!(c.is_err()); } #[test] fn test_array_out_of_range_negative() { - let c: Result = [-10, -256, -1].try_into(); + let c: Result = [-10, -256, -1].try_into(); assert!(c.is_err()); } #[test] fn test_array_sum() { - let c: Result = [-1, 255, 255].try_into(); + let c: Result = [-1, 255, 255].try_into(); assert!(c.is_err()); } #[test] fn test_array_correct() { - let c: Result = [183, 65, 14].try_into(); + let c: Result = [183, 65, 14].try_into(); + assert!(c.is_ok()); assert_eq!( - c, - Ok(Color { + c.unwrap(), + Color { red: 183, green: 65, blue: 14 - }) + } ); } #[test] @@ -131,14 +134,15 @@ mod tests { #[test] fn test_slice_correct() { let v = vec![183, 65, 14]; - let c: Result = Color::try_from(&v[..]); + let c: Result = Color::try_from(&v[..]); + assert!(c.is_ok()); assert_eq!( - c, - Ok(Color { + c.unwrap(), + Color { red: 183, green: 65, blue: 14 - }) + } ); } #[test] From c3e7b831786c9172ed8bd5d150f3c432f242fba9 Mon Sep 17 00:00:00 2001 From: Taylor Yu Date: Sun, 4 Apr 2021 18:43:38 -0500 Subject: [PATCH 2/2] fix: use trait objects for from_str Use `Box` to allow solutions to use `?` to propagate errors. --- exercises/conversions/from_str.rs | 3 ++- info.toml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/exercises/conversions/from_str.rs b/exercises/conversions/from_str.rs index 41fccd7e..4beebacd 100644 --- a/exercises/conversions/from_str.rs +++ b/exercises/conversions/from_str.rs @@ -2,6 +2,7 @@ // Additionally, upon implementing FromStr, you can use the `parse` method // on strings to generate an object of the implementor type. // You can read more about it at https://doc.rust-lang.org/std/str/trait.FromStr.html +use std::error; use std::str::FromStr; #[derive(Debug)] @@ -23,7 +24,7 @@ struct Person { // If everything goes well, then return a Result of a Person object impl FromStr for Person { - type Err = String; + type Err = Box; fn from_str(s: &str) -> Result { } } diff --git a/info.toml b/info.toml index 2068750a..4a1d3aa3 100644 --- a/info.toml +++ b/info.toml @@ -884,5 +884,5 @@ path = "exercises/conversions/from_str.rs" mode = "test" hint = """ The implementation of FromStr should return an Ok with a Person object, -or an Err with a string if the string is not valid. +or an Err with an error if the string is not valid. This is almost like the `try_from_into` exercise."""