buup/transformers/
hex_to_hsl.rs

1use crate::utils::Color;
2use crate::{Transform, TransformError, TransformerCategory};
3
4/// Hex to HSL color transformer
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub struct HexToHsl;
7
8impl Transform for HexToHsl {
9    fn name(&self) -> &'static str {
10        "Hex to HSL"
11    }
12
13    fn id(&self) -> &'static str {
14        "hex_to_hsl"
15    }
16
17    fn category(&self) -> TransformerCategory {
18        TransformerCategory::Color
19    }
20
21    fn description(&self) -> &'static str {
22        "Converts hex color code to HSL format"
23    }
24
25    fn transform(&self, input: &str) -> Result<String, TransformError> {
26        let input = input.trim();
27        if !input.starts_with('#') {
28            return Err(TransformError::InvalidArgument(
29                "Invalid hex color format. Must start with #".into(),
30            ));
31        }
32
33        let color = Color::from_hex(input)?;
34        Ok(color.to_hsl())
35    }
36
37    fn default_test_input(&self) -> &'static str {
38        "#FF0000"
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn test_hex_to_hsl() {
48        let transformer = HexToHsl;
49        assert_eq!(
50            transformer.transform("#FF0000").unwrap(),
51            "hsl(0deg,100%,50%)"
52        );
53        assert_eq!(
54            transformer.transform("#00FF00").unwrap(),
55            "hsl(120deg,100%,50%)"
56        );
57        assert_eq!(
58            transformer.transform("#0000FF").unwrap(),
59            "hsl(240deg,100%,50%)"
60        );
61        assert_eq!(transformer.transform("#000000").unwrap(), "hsl(0deg,0%,0%)");
62        assert_eq!(
63            transformer.transform("#FFFFFF").unwrap(),
64            "hsl(0deg,0%,100%)"
65        );
66    }
67
68    #[test]
69    fn test_with_alpha() {
70        let transformer = HexToHsl;
71        assert_eq!(
72            transformer.transform("#FF0000FF").unwrap(),
73            "hsl(0deg,100%,50%,1.00)"
74        );
75        assert_eq!(
76            transformer.transform("#00FF0080").unwrap(),
77            "hsl(120deg,100%,50%,0.50)"
78        );
79    }
80
81    #[test]
82    fn test_invalid_input() {
83        let transformer = HexToHsl;
84        assert!(transformer.transform("invalid").is_err());
85        assert!(transformer.transform("FF0000").is_err()); // Missing #
86        assert!(transformer.transform("#GG0000").is_err()); // Invalid hex
87    }
88}