sarcasm_utils/
encode.rs

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
21/// Transform normal text into SaRcAsM text.
22///
23/// # Arguments
24///
25/// - `input` - Input string to be transformed.
26/// - `start` - The case of the first letter in the SaRcAsM text.
27///
28/// # Returns
29///
30/// Fully transformed string.
31///
32/// # Examples
33///
34/// ```edition2018
35/// # use sarcasm_utils::{encode_sarcasm, StartingCase};
36/// assert_eq!(encode_sarcasm("Hello World!", StartingCase::Uppercase), "HeLlO WoRlD!");
37/// assert_eq!(encode_sarcasm("Hello World!", StartingCase::Lowercase), "hElLo wOrLd!");
38/// ```
39pub 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}