1use colorsys::Hsl;
2
3pub fn parse_colour_param(p: &str, key: &str) -> Option<f32> {
5 let parts: Vec<&str> = p.split(":").collect();
6 if parts.len() != 2 {
7 return None;
8 }
9
10 let k = parts[0];
11 let v = parts[1];
12 if key != k {
13 return None;
14 }
15
16 v.parse::<f32>().ok()
17}
18
19#[allow(clippy::assertions_on_constants)]
20fn pct_to_hue(pct: f32) -> f32 {
21 const LEFT_STOP: f32 = 0.0; const RIGHT_STOP: f32 = 120.0; assert!(RIGHT_STOP > LEFT_STOP);
24 LEFT_STOP + ((1.0 - pct) * (RIGHT_STOP - LEFT_STOP))
26}
27
28const DEFAULT_SATURATION: f32 = 100.0;
29const DEFAULT_LIGHTNESS: f32 = 50.0;
30
31pub fn pct_value_hsl(norm: f32, s: Option<f32>, l: Option<f32>) -> Hsl {
32 let hue = pct_to_hue(norm);
33 let s = s.unwrap_or(DEFAULT_SATURATION);
34 let l = l.unwrap_or(DEFAULT_LIGHTNESS);
35 Hsl::from((hue, s, l))
36}
37
38#[cfg(test)]
39mod tests {
40 use super::*;
41 use colorsys::Rgb;
42
43 #[test]
44 fn test_hsl_to_rgb_red() {
45 let hsl = Hsl::from((0.0, 100.0, 50.0));
46 let rgb: [u8; 3] = Rgb::from(&hsl).into();
47 assert_eq!((255, 0, 0), rgb.into());
48 }
49
50 #[test]
51 fn test_hsl_to_rgb_green() {
52 let hsl = Hsl::from((120.0, 100.0, 50.0));
53 let rgb: [u8; 3] = Rgb::from(&hsl).into();
54 assert_eq!((0, 255, 0), rgb.into());
55 }
56}