buup/transformers/
hsl_to_rgb.rs

1use crate::utils::Color;
2use crate::{Transform, TransformError, TransformerCategory};
3
4/// HSL to RGB color transformer
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub struct HslToRgb;
7
8impl Transform for HslToRgb {
9    fn name(&self) -> &'static str {
10        "HSL to RGB"
11    }
12
13    fn id(&self) -> &'static str {
14        "hsl_to_rgb"
15    }
16
17    fn category(&self) -> TransformerCategory {
18        TransformerCategory::Color
19    }
20
21    fn description(&self) -> &'static str {
22        "Converts HSL color to RGB format"
23    }
24
25    fn transform(&self, input: &str) -> Result<String, TransformError> {
26        let input = input.trim();
27        if !input.starts_with("hsl(") {
28            return Err(TransformError::InvalidArgument(
29                "Invalid HSL format. Must start with hsl(".into(),
30            ));
31        }
32
33        let color = Color::from_hsl(input)?;
34        Ok(color.to_rgb())
35    }
36
37    fn default_test_input(&self) -> &'static str {
38        "hsl(0deg, 100%, 50%)"
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn test_hsl_to_rgb() {
48        let transformer = HslToRgb;
49        assert_eq!(
50            transformer.transform("hsl(0deg, 100%, 50%)").unwrap(),
51            "rgb(255,0,0)"
52        );
53        assert_eq!(
54            transformer.transform("hsl(120deg, 100%, 50%)").unwrap(),
55            "rgb(0,255,0)"
56        );
57        assert_eq!(
58            transformer.transform("hsl(240deg, 100%, 50%)").unwrap(),
59            "rgb(0,0,255)"
60        );
61        assert_eq!(
62            transformer.transform("hsl(0deg, 0%, 0%)").unwrap(),
63            "rgb(0,0,0)"
64        );
65        assert_eq!(
66            transformer.transform("hsl(0deg, 0%, 100%)").unwrap(),
67            "rgb(255,255,255)"
68        );
69    }
70
71    #[test]
72    fn test_with_alpha() {
73        let transformer = HslToRgb;
74        assert_eq!(
75            transformer.transform("hsl(0deg, 100%, 50%, 1.0)").unwrap(),
76            "rgb(255,0,0,255)"
77        );
78        assert_eq!(
79            transformer
80                .transform("hsl(120deg, 100%, 50%, 0.5)")
81                .unwrap(),
82            "rgb(0,255,0,127)"
83        );
84    }
85
86    #[test]
87    fn test_invalid_input() {
88        let transformer = HslToRgb;
89        assert!(transformer.transform("invalid").is_err());
90        assert!(transformer.transform("0deg, 100%, 50%").is_err()); // Missing hsl(
91                                                                    // Note: HSL implementation accepts values outside the normal range
92        assert!(transformer.transform("hsl(400, 100%, 50%)").is_ok()); // This is actually valid in the color implementation
93    }
94}