tmux_applets/
common.rs

1use colorsys::Hsl;
2
3// Parse a colour parameter in the form: `{key}:{val}` where `{val}` is a float
4pub 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; // Red
22    const RIGHT_STOP: f32 = 120.0; // Green
23    assert!(RIGHT_STOP > LEFT_STOP);
24    // Note: pct is inverted as we want to transition from green to red
25    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}