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