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}