finish try_from_into exercise

This commit is contained in:
lukaszKielar 2020-06-30 21:54:19 +02:00
parent 1336838264
commit 69e28a031c

View file

@ -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,
})
}
}
}