use image::Rgb;
mod palette_color_provider;
mod random_color_provider;
pub use palette_color_provider::*;
pub use random_color_provider::*;
pub trait ColorProvider {
fn random_color(&mut self) -> Rgb<u8>;
}
pub fn color_from_hex(hex: &str) -> Result<Rgb<u8>, String> {
let mut hex = hex;
if hex.starts_with('#') {
hex = &hex[1..hex.len()];
}
if hex.len() != 6 {
return Err(format!("Not a color: '{}'", hex));
}
let r = &hex[0..=1];
let g = &hex[2..=3];
let b = &hex[4..=5];
let r = match u8::from_str_radix(r, 16) {
Ok(v) => v,
Err(e) => return Err(e.to_string()),
};
let g = match u8::from_str_radix(g, 16) {
Ok(v) => v,
Err(e) => return Err(e.to_string()),
};
let b = match u8::from_str_radix(b, 16) {
Ok(v) => v,
Err(e) => return Err(e.to_string()),
};
Ok(Rgb([r, g, b]))
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn color_from_hex() {
assert_eq!(
Rgb([239, 89, 123]),
super::color_from_hex("EF597B").unwrap()
);
}
#[test]
fn color_from_hex_not_a_color() {
let c = super::color_from_hex("foobar");
assert!(c.is_err());
let c = super::color_from_hex("foo");
assert!(c.is_err());
}
}