2021-05-16 11:45:53 +01:00
|
|
|
use std::fmt;
|
|
|
|
|
|
2021-05-15 16:59:51 +01:00
|
|
|
use serde_derive::{Serialize, Deserialize};
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Eq, PartialEq, Serialize, Deserialize)]
|
|
|
|
|
pub struct Colour {
|
|
|
|
|
pub red: u8,
|
|
|
|
|
pub green: u8,
|
|
|
|
|
pub blue: u8,
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-15 23:08:31 +01:00
|
|
|
impl From<&str> for Colour {
|
|
|
|
|
fn from(str: &str) -> Self {
|
2021-05-15 23:21:48 +01:00
|
|
|
Self::from(hex::decode(&str[str.len() - 6..]).unwrap())
|
2021-05-15 23:08:31 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl From<Vec<u8>> for Colour {
|
|
|
|
|
fn from(colours: Vec<u8>) -> Self {
|
2021-05-15 16:59:51 +01:00
|
|
|
Colour {
|
2021-05-18 20:17:12 +01:00
|
|
|
red: *colours.get(0).unwrap_or(&0),
|
|
|
|
|
green: *colours.get(1).unwrap_or(&0),
|
|
|
|
|
blue: *colours.get(2).unwrap_or(&0),
|
2021-05-15 16:59:51 +01:00
|
|
|
}
|
|
|
|
|
}
|
2021-05-15 23:08:31 +01:00
|
|
|
}
|
2021-05-15 16:59:51 +01:00
|
|
|
|
2021-05-16 11:45:53 +01:00
|
|
|
impl fmt::Display for Colour {
|
|
|
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
|
|
|
write!(f, "#{}", hex::encode([self.red, self.green, self.blue]))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-15 23:08:31 +01:00
|
|
|
impl Into<Vec<u8>> for Colour {
|
|
|
|
|
fn into(self) -> Vec<u8> {
|
2021-05-15 22:38:43 +01:00
|
|
|
vec![self.red, self.green, self.blue]
|
2021-05-15 16:59:51 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
|
mod test {
|
|
|
|
|
use crate::Colour;
|
|
|
|
|
|
2021-05-15 23:08:31 +01:00
|
|
|
#[test]
|
|
|
|
|
fn test_colour_from_hex() {
|
|
|
|
|
assert_eq!(Colour::from("#ff00ff" ), Colour { red: 255, green: 0, blue: 255 });
|
|
|
|
|
assert_eq!(Colour::from("0xffffff"), Colour { red: 255, green: 255, blue: 255 });
|
|
|
|
|
assert_eq!(Colour::from("ffffff" ), Colour { red: 255, green: 255, blue: 255 });
|
|
|
|
|
assert_eq!(Colour::from("#010203" ), Colour { red: 1, green: 2, blue: 3 });
|
|
|
|
|
assert_eq!(Colour::from("0xa0b0c0"), Colour { red: 160, green: 176, blue: 192 });
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-16 11:45:53 +01:00
|
|
|
#[test]
|
|
|
|
|
fn test_colour_to_hex() {
|
|
|
|
|
assert_eq!(Colour { red: 255, green: 255, blue: 255 }.to_string(), "#ffffff");
|
|
|
|
|
assert_eq!(Colour { red: 0, green: 0, blue: 0 }.to_string(), "#000000");
|
|
|
|
|
assert_eq!(Colour { red: 0, green: 128, blue: 64 }.to_string(), "#008040");
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-15 16:59:51 +01:00
|
|
|
#[test]
|
|
|
|
|
fn test_colour_from_intermediate() {
|
2021-05-15 22:38:43 +01:00
|
|
|
let output = Colour::from(vec![64, 128, 192]);
|
|
|
|
|
let expected = Colour { red: 64, green: 128, blue: 192 };
|
2021-05-15 16:59:51 +01:00
|
|
|
assert_eq!(output, expected);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn test_colour_to_intermediate() {
|
2021-05-15 23:08:31 +01:00
|
|
|
let output: Vec<u8> = Colour { red: 64, green: 128, blue: 192 }.into();
|
2021-05-15 22:38:43 +01:00
|
|
|
let expected = vec![64, 128, 192];
|
2021-05-15 16:59:51 +01:00
|
|
|
assert_eq!(output, expected);
|
|
|
|
|
}
|
|
|
|
|
}
|