color.rs

 1use anyhow::Result;
 2use gpui::Hsla;
 3use palette::FromColor;
 4
 5#[allow(unused)]
 6pub(crate) fn try_parse_color(color: &str) -> Result<Hsla> {
 7    let rgba = gpui::Rgba::try_from(color)?;
 8    let rgba = palette::rgb::Srgba::from_components((rgba.r, rgba.g, rgba.b, rgba.a));
 9    let hsla = palette::Hsla::from_color(rgba);
10
11    let hsla = gpui::hsla(
12        hsla.hue.into_positive_degrees() / 360.,
13        hsla.saturation,
14        hsla.lightness,
15        hsla.alpha,
16    );
17
18    Ok(hsla)
19}
20
21#[allow(unused)]
22pub(crate) fn pack_color(color: Hsla) -> u32 {
23    let hsla = palette::Hsla::from_components((color.h * 360., color.s, color.l, color.a));
24    let rgba = palette::rgb::Srgba::from_color(hsla);
25    let rgba = rgba.into_format::<u8, u8>();
26
27    u32::from(rgba)
28}
29
30#[cfg(test)]
31mod tests {
32    use super::*;
33
34    #[test]
35    pub fn test_serialize_color() {
36        let color = "#b4637aff";
37        let hsla = try_parse_color(color).unwrap();
38        let packed = pack_color(hsla);
39
40        assert_eq!(format!("#{:x}", packed), color);
41    }
42
43    #[test]
44    pub fn test_serialize_color_with_palette() {
45        let color = "#b4637aff";
46
47        let rgba = gpui::Rgba::try_from(color).unwrap();
48        let rgba = palette::rgb::Srgba::from_components((rgba.r, rgba.g, rgba.b, rgba.a));
49        let hsla = palette::Hsla::from_color(rgba);
50
51        let rgba = palette::rgb::Srgba::from_color(hsla);
52        let rgba = rgba.into_format::<u8, u8>();
53
54        assert_eq!(format!("#{:x}", rgba), color);
55    }
56}