diff --git a/src/base4.rs b/src/base4.rs index 6453142..e7c26c0 100644 --- a/src/base4.rs +++ b/src/base4.rs @@ -29,12 +29,42 @@ pub fn encode(text: String) -> String { for i in 0..words_as_bytes.len() { results.push(Vec::new()); for j in 0..words_as_bytes[i].len() { - results[i].push(core::num_to_cat(words_as_bytes[i][j] as u32, alphabet(), char_length())); + results[i].push(core::num_to_cat( + words_as_bytes[i][j] as u32, + alphabet(), + char_length(), + )); } } let results: Vec<String> = results.into_iter().map(|item| item.join(" ")).collect(); let results = results.join("; "); return results; - +} + +/// Decodes base 4 catspeak to english text +/// +/// ``` +/// use cat2text::base4::decode; +/// +/// assert_eq!("i love cats", decode("meow mreow mrrp; meow mrow meow meow mrow mrow mrrp mrrp mreow meow mrrp mrrp; meow meow mrow meow meow mrrp mrrp mrrp meow mrrp meow mrow".to_string())); +/// ``` +pub fn decode(text: String) -> String { + let catspeak_words: Vec<String> = text + .split("; ") + .into_iter() + .map(|item| item.to_string()) + .collect(); + let mut output: String = String::new(); + for engl_word in catspeak_words { + let mut word = "".to_string(); + for engl_letter in core::split_every_3(engl_word) { + let char_num = core::cat_to_num(engl_letter.split(" ").map(|item| item.to_string()).collect(), alphabet(), char_length()); + word += String::from_utf8(vec![(char_num + 96) as u8]).unwrap().as_str(); + } + word += " "; + output += word.as_str(); + } + + return output.trim().to_string(); } diff --git a/src/main.rs b/src/main.rs index 8fd3582..ade722c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,11 +18,9 @@ fn main() { stdin.read_line(&mut input).unwrap(); println!( "{}", - core::num_to_cat( - input.trim().parse().unwrap(), - base4::alphabet(), - base4::char_length() - ) + base4::decode( + input.trim().to_string() + ) ); } else if trimmed == "2".to_string() { input = "".to_string();