buup/transformers/
hsl_to_rgb.rs1use crate::utils::Color;
2use crate::{Transform, TransformError, TransformerCategory};
3
4#[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()); assert!(transformer.transform("hsl(400, 100%, 50%)").is_ok()); }
94}