buup/transformers/
hex_to_hsl.rs1use crate::utils::Color;
2use crate::{Transform, TransformError, TransformerCategory};
3
4#[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()); assert!(transformer.transform("#GG0000").is_err()); }
88}