buup/transformers/
rgb_to_hex.rs

1use crate::utils::Color;
2use crate::{Transform, TransformError, TransformerCategory};
3
4/// RGB to Hex color transformer
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub struct RgbToHex;
7
8impl Transform for RgbToHex {
9    fn name(&self) -> &'static str {
10        "RGB to Hex"
11    }
12
13    fn id(&self) -> &'static str {
14        "rgb_to_hex"
15    }
16
17    fn category(&self) -> TransformerCategory {
18        TransformerCategory::Color
19    }
20
21    fn description(&self) -> &'static str {
22        "Converts RGB color to hex format"
23    }
24
25    fn transform(&self, input: &str) -> Result<String, TransformError> {
26        let input = input.trim();
27        if !input.starts_with("rgb(") {
28            return Err(TransformError::InvalidArgument(
29                "Invalid RGB format. Must start with rgb(".into(),
30            ));
31        }
32
33        let color = Color::from_rgb(input)?;
34        Ok(color.to_hex())
35    }
36
37    fn default_test_input(&self) -> &'static str {
38        "rgb(255, 0, 0)"
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn test_rgb_to_hex() {
48        let transformer = RgbToHex;
49        assert_eq!(transformer.transform("rgb(255, 0, 0)").unwrap(), "#ff0000");
50        assert_eq!(transformer.transform("rgb(0, 255, 0)").unwrap(), "#00ff00");
51        assert_eq!(transformer.transform("rgb(0, 0, 255)").unwrap(), "#0000ff");
52        assert_eq!(transformer.transform("rgb(0, 0, 0)").unwrap(), "#000000");
53        assert_eq!(
54            transformer.transform("rgb(255, 255, 255)").unwrap(),
55            "#ffffff"
56        );
57    }
58
59    #[test]
60    fn test_with_alpha() {
61        let transformer = RgbToHex;
62        assert_eq!(
63            transformer.transform("rgb(255, 0, 0, 255)").unwrap(),
64            "#ff0000ff"
65        );
66        assert_eq!(
67            transformer.transform("rgb(0, 255, 0, 128)").unwrap(),
68            "#00ff0080"
69        );
70    }
71
72    #[test]
73    fn test_invalid_input() {
74        let transformer = RgbToHex;
75        assert!(transformer.transform("invalid").is_err());
76        assert!(transformer.transform("255, 0, 0").is_err()); // Missing rgb(
77        assert!(transformer.transform("rgb(300, 0, 0)").is_err()); // Invalid value
78    }
79}