buup/transformers/
rot13.rs

1use crate::{Transform, TransformError, TransformerCategory};
2
3#[derive(Debug, Clone, Copy, Default)]
4pub struct Rot13;
5
6impl Rot13 {
7    fn rot13_char(c: char) -> char {
8        if c.is_ascii_alphabetic() {
9            let base = if c.is_ascii_lowercase() { b'a' } else { b'A' };
10            let rotated = base + (c as u8 - base + 13) % 26;
11            rotated as char
12        } else {
13            c
14        }
15    }
16}
17
18impl Transform for Rot13 {
19    fn name(&self) -> &'static str {
20        "ROT13 Cipher"
21    }
22
23    fn id(&self) -> &'static str {
24        "rot13"
25    }
26
27    fn description(&self) -> &'static str {
28        "Applies the ROT13 substitution cipher to the input text."
29    }
30
31    fn category(&self) -> TransformerCategory {
32        TransformerCategory::Encoder // Or Other, could be debated
33    }
34
35    fn transform(&self, input: &str) -> Result<String, TransformError> {
36        let transformed: String = input.chars().map(Rot13::rot13_char).collect();
37        Ok(transformed)
38    }
39}
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44    use crate::Transform;
45
46    #[test]
47    fn test_rot13_transformation() {
48        let transformer = Rot13;
49        assert_eq!(
50            transformer.transform("Hello, World!").unwrap(),
51            "Uryyb, Jbeyq!"
52        );
53        assert_eq!(
54            transformer.transform("uryyb, jbeyq!").unwrap(),
55            "hello, world!"
56        );
57        assert_eq!(transformer.transform("123 !@#").unwrap(), "123 !@#");
58        assert_eq!(transformer.transform("").unwrap(), "");
59        assert_eq!(
60            transformer
61                .transform("The quick brown fox jumps over the lazy dog.")
62                .unwrap(),
63            "Gur dhvpx oebja sbk whzcf bire gur ynml qbt."
64        );
65    }
66
67    #[test]
68    fn test_rot13_metadata() {
69        let transformer = Rot13;
70        assert_eq!(transformer.id(), "rot13");
71        assert_eq!(transformer.name(), "ROT13 Cipher");
72        assert_eq!(transformer.category(), TransformerCategory::Encoder);
73    }
74}