buup/transformers/
hex_encode.rs1use crate::{Transform, TransformError, TransformerCategory};
2
3#[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
29fn 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}