macro_rules! impl_colour_methods {
($colour_type:ty) => {
impl $colour_type {
pub fn to_rgb(&self) -> Rgb<u8> {
let colour = self.to_string();
let r: u8 = u8::from_str_radix(&colour[1..3], 16).unwrap();
let g: u8 = u8::from_str_radix(&colour[3..5], 16).unwrap();
let b: u8 = u8::from_str_radix(&colour[5..7], 16).unwrap();
Rgb::new(r, g, b)
}
pub fn to_hex_triplet(&self, prefix: crate::Prefix) -> String {
let rgb = self.to_rgb();
let prefix = match prefix {
crate::Prefix::Hash => "#",
crate::Prefix::None => "",
};
format!("{}{:02X}{:02X}{:02X}", prefix, rgb.r, rgb.g, rgb.b)
}
}
impl std::str::FromStr for $colour_type {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match Self::parse(s) {
Some(colour) => Ok(colour),
None => Err(format!("Invalid Colour: {s}")),
}
}
}
};
}