buup/transformers/
dec_to_hex.rs

1use crate::{Transform, TransformError, TransformerCategory};
2use std::fmt;
3
4#[derive(Debug)]
5pub enum DecToHexError {
6    ParseError(std::num::ParseIntError),
7}
8
9impl fmt::Display for DecToHexError {
10    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
11        match self {
12            DecToHexError::ParseError(e) => write!(f, "Failed to parse decimal: {}", e),
13        }
14    }
15}
16
17impl std::error::Error for DecToHexError {}
18
19impl From<DecToHexError> for TransformError {
20    fn from(err: DecToHexError) -> Self {
21        // For simplicity, mapping specific parse error to a generic HexDecodeError variant
22        // We might want a more specific error variant in TransformError later.
23        TransformError::HexDecodeError(err.to_string())
24    }
25}
26
27#[derive(Clone, Copy, Default, PartialEq, Eq, Hash, Debug)]
28pub struct DecToHexTransformer;
29
30impl Transform for DecToHexTransformer {
31    fn id(&self) -> &'static str {
32        "dec_to_hex"
33    }
34
35    fn name(&self) -> &'static str {
36        "Decimal to Hex"
37    }
38
39    fn description(&self) -> &'static str {
40        "Convert decimal numbers to hexadecimal."
41    }
42
43    fn category(&self) -> TransformerCategory {
44        TransformerCategory::Encoder
45    }
46
47    fn transform(&self, input: &str) -> Result<String, TransformError> {
48        if input.is_empty() {
49            return Ok("".to_string());
50        }
51        let decimal_value = input
52            .trim()
53            .parse::<u64>()
54            .map_err(DecToHexError::ParseError)?;
55        let hex_string = format!("{:X}", decimal_value);
56        Ok(hex_string)
57    }
58
59    fn default_test_input(&self) -> &'static str {
60        "255" // Represents FF in hex
61    }
62}
63
64#[cfg(test)]
65mod tests {
66    use super::*;
67
68    #[test]
69    fn test_dec_to_hex() {
70        let transformer = DecToHexTransformer;
71        assert_eq!(
72            transformer
73                .transform(transformer.default_test_input())
74                .unwrap(),
75            "FF".to_string()
76        );
77        assert_eq!(transformer.transform("0").unwrap(), "0".to_string());
78        assert_eq!(transformer.transform("42").unwrap(), "2A".to_string());
79        assert_eq!(transformer.transform("65535").unwrap(), "FFFF".to_string());
80    }
81
82    #[test]
83    fn test_dec_to_hex_invalid_input() {
84        let transformer = DecToHexTransformer;
85        assert!(transformer.transform("abc").is_err());
86        assert!(transformer.transform("10.5").is_err());
87    }
88
89    #[test]
90    fn test_empty_input() {
91        let transformer = DecToHexTransformer;
92        assert_eq!(transformer.transform("").unwrap(), "");
93    }
94}