buup/transformers/
dec_to_hex.rs1use 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 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" }
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}