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