1use crate::StartingCase;
2use itertools::Itertools;
3use log::{debug, info, trace};
4
5#[inline]
6fn encode_lower(input: &str) -> String {
7 let first = input.chars().step_by(2).flat_map(|c| c.to_lowercase());
8 let second = input.chars().skip(1).step_by(2).flat_map(|c| c.to_uppercase());
9
10 first.interleave(second).collect()
11}
12
13#[inline]
14fn encode_upper(input: &str) -> String {
15 let first = input.chars().step_by(2).flat_map(|c| c.to_uppercase());
16 let second = input.chars().skip(1).step_by(2).flat_map(|c| c.to_lowercase());
17
18 first.interleave(second).collect()
19}
20
21pub fn encode_sarcasm(input: &str, start: StartingCase) -> String {
40 info!("Encoding {} bytes to sarcasm", input.len());
41 trace!("Encoding input: {}", input);
42
43 let result = match start {
44 StartingCase::Lowercase => {
45 debug!("Encoding as lOwErCaSe SaRcAsM tExT");
46 encode_lower(input)
47 }
48 StartingCase::Uppercase => {
49 debug!("Encoding as lOwErCaSe SaRcAsM tExT");
50 encode_upper(input)
51 }
52 };
53
54 info!("Encoded {} bytes successfully", result.len());
55 trace!("Encoding output: {}", result);
56
57 result
58}