buup/transformers/
hex_encode.rs

1use crate::{Transform, TransformError, TransformerCategory};
2
3/// Hex encode transformer
4#[derive(Debug, Clone, Copy, PartialEq, Eq)]
5pub struct HexEncode;
6
7impl Transform for HexEncode {
8    fn name(&self) -> &'static str {
9        "Hex Encode"
10    }
11
12    fn id(&self) -> &'static str {
13        "hexencode"
14    }
15
16    fn description(&self) -> &'static str {
17        "Encode text to hexadecimal representation"
18    }
19
20    fn category(&self) -> TransformerCategory {
21        TransformerCategory::Encoder
22    }
23
24    fn transform(&self, input: &str) -> Result<String, TransformError> {
25        Ok(hex_encode(input.as_bytes()))
26    }
27}
28
29/// Encodes bytes to hexadecimal without external dependencies
30fn hex_encode(input: &[u8]) -> String {
31    const HEX_CHARS: &[u8] = b"0123456789abcdef";
32    let mut output = Vec::with_capacity(input.len() * 2);
33
34    for &byte in input {
35        output.push(HEX_CHARS[(byte >> 4) as usize]);
36        output.push(HEX_CHARS[(byte & 0xf) as usize]);
37    }
38
39    String::from_utf8(output).unwrap()
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn test_hex_encode() {
48        let transformer = HexEncode;
49        assert_eq!(
50            transformer.transform("Hello, World!").unwrap(),
51            "48656c6c6f2c20576f726c6421"
52        );
53        assert_eq!(transformer.transform("").unwrap(), "");
54        assert_eq!(transformer.transform("a").unwrap(), "61");
55        assert_eq!(transformer.transform("AB").unwrap(), "4142");
56    }
57}