diff --git a/exercises/conversions/try_from_into.rs b/exercises/conversions/try_from_into.rs index dbdbe00..64362db 100644 --- a/exercises/conversions/try_from_into.rs +++ b/exercises/conversions/try_from_into.rs @@ -2,7 +2,7 @@ // Basically, this is the same as From. The main difference is that this should return a Result type // 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::{TryInto, TryFrom}; +use std::convert::{TryFrom, TryInto}; #[derive(Debug)] struct Color { @@ -11,8 +11,6 @@ struct Color { blue: u8, } -// I AM NOT DONE - // Your task is to complete this implementation // and return an Ok result of inner type Color. // You need create implementation for a tuple of three integer, @@ -26,6 +24,19 @@ struct Color { impl TryFrom<(i16, i16, i16)> for Color { type Error = String; fn try_from(tuple: (i16, i16, i16)) -> Result<Self, Self::Error> { + if (tuple.0 < 0) | (tuple.0 > 256) { + Err(format!("{} not in a range <0, 255>", tuple.0)) + } else if (tuple.1 < 0) | (tuple.1 > 256) { + Err(format!("{} not in a range <0, 255>", tuple.1)) + } else if (tuple.2 < 0) | (tuple.2 > 256) { + Err(format!("{} not in a range <0, 255>", tuple.2)) + } else { + Ok(Color { + red: tuple.0 as u8, + green: tuple.1 as u8, + blue: tuple.2 as u8, + }) + } } } @@ -33,6 +44,24 @@ impl TryFrom<(i16, i16, i16)> for Color { impl TryFrom<[i16; 3]> for Color { type Error = String; fn try_from(arr: [i16; 3]) -> Result<Self, Self::Error> { + if arr.len() != 3 { + Err(format!( + "Cannot construct Color struct from {:?} array", + arr + )) + } else if (arr[0] < 0) | (arr[0] > 256) { + Err(format!("{} not in a range <0, 255>", arr[0])) + } else if (arr[1] < 0) | (arr[1] > 256) { + Err(format!("{} not in a range <0, 255>", arr[1])) + } else if (arr[2] < 0) | (arr[2] > 256) { + Err(format!("{} not in a range <0, 255>", arr[2])) + } else { + Ok(Color { + red: arr[0] as u8, + green: arr[1] as u8, + blue: arr[2] as u8, + }) + } } } @@ -40,6 +69,24 @@ impl TryFrom<[i16; 3]> for Color { impl TryFrom<&[i16]> for Color { type Error = String; fn try_from(slice: &[i16]) -> Result<Self, Self::Error> { + if slice.len() != 3 { + Err(format!( + "Cannot construct Color struct from {:?} slice", + slice + )) + } else if (slice[0] < 0) | (slice[0] > 256) { + Err(format!("{} not in a range <0, 255>", slice[0])) + } else if (slice[1] < 0) | (slice[1] > 256) { + Err(format!("{} not in a range <0, 255>", slice[1])) + } else if (slice[2] < 0) | (slice[2] > 256) { + Err(format!("{} not in a range <0, 255>", slice[2])) + } else { + Ok(Color { + red: slice[0] as u8, + green: slice[1] as u8, + blue: slice[2] as u8, + }) + } } }