diff --git a/src/anybase.rs b/src/anybase.rs index 9fcd968..8448623 100644 --- a/src/anybase.rs +++ b/src/anybase.rs @@ -15,6 +15,13 @@ pub fn max_base() -> u32 { } /// Returns the minimum catspeak words per character needed for this base +/// +/// ``` +/// use cat2text::anybase::char_length; +/// +/// let base = 10; +/// assert_eq!(char_length(base), 2) +/// ``` pub fn char_length(base: u32) -> u32 { for i in 1..base + 1 { let num = base.pow(i); @@ -31,11 +38,12 @@ pub fn char_length(base: u32) -> u32 { /// /// ``` /// use cat2text::anybase; +/// /// let text = "i love cats".to_string(); /// let base = 10; /// let char_length = anybase::char_length(base); /// -/// assert_eq!("", anybase::encode(text, base, char_length)); +/// assert_eq!("meow mewo; mrrp mreow mrrp nyaaaa~ mreow mreow meow nyaaaa~; meow mrow meow mrrp mreow meow mrrp mewo", anybase::encode(text, base, char_length)); /// ``` pub fn encode(text: String, base: u32, char_length: u32) -> String { let mut shortened_alphabet = alphabet(); @@ -76,6 +84,7 @@ pub fn encode(text: String, base: u32, char_length: u32) -> String { /// /// ``` /// use cat2text::anybase; +/// /// let text = "meow mewo; mrrp mreow mrrp nyaaaa~ mreow mreow meow nyaaaa~; meow mrow meow mrrp mreow meow mrrp mewo".to_string(); /// let base = 10; /// let char_length = anybase::char_length(base); @@ -89,7 +98,7 @@ pub fn decode(text: String, base: u32, char_length: u32) -> String { shortened_alphabet.truncate(base as usize); for engl_word in catspeak_words { let mut word = String::new(); - for engl_letter in core::split_every_x(engl_word, char_length as usize) { + for engl_letter in core::split_every_x(engl_word, char_length) { let char_num = core::cat_to_num( engl_letter .split(" ") @@ -108,3 +117,56 @@ pub fn decode(text: String, base: u32, char_length: u32) -> String { return output.trim().to_string(); } +pub mod bytes { + use crate::anybase::alphabet; + use crate::core; + /// Encodes from bytes into catspeak + /// + /// ``` + /// use cat2text::anybase::{bytes::encode, char_length}; + /// + /// let bytes = &[9, 1]; + /// let base = 10; + /// let char_length = char_length(base); + /// + /// assert_eq!("meow mewo meow mrrp", encode(bytes, base, char_length)); + /// ``` + pub fn encode(bytes: impl AsRef<[u8]>, base: u32, char_length: u32) -> String { + let mut output = String::new(); + let mut shortened_alphabet = alphabet(); + shortened_alphabet.truncate(base as usize); + for byte in bytes.as_ref() { + output += core::num_to_cat(*byte as u32, shortened_alphabet.clone(), char_length).as_str(); + output += " "; + } + return output.trim().to_string(); + } + + /// Decodes catspeak into bytes + /// + /// ``` + /// use cat2text::anybase::{bytes::decode, char_length}; + /// + /// let text = "mreow mrrp meow mrrp".to_string(); + /// let base = 10; + /// let char_length = char_length(base); + /// + /// assert_eq!( + /// vec![21, 1], + /// decode(text, base, char_length) + /// ); + /// ``` + pub fn decode(text: String, base: u32, char_length: u32) -> Vec<u8> { + let mut output: Vec<u8> = Vec::new(); + let mut shortened_alphabet = alphabet(); + shortened_alphabet.truncate(base as usize); + for byte in core::split_every_x(text.clone(), char_length) { + output.push(core::cat_to_num( + byte.split(" ").map(|item| item.to_string()).collect(), + shortened_alphabet.clone(), + char_length, + ) as u8); + } + return output.into(); + } +} diff --git a/src/core.rs b/src/core.rs index 1b75195..951c687 100644 --- a/src/core.rs +++ b/src/core.rs @@ -65,7 +65,8 @@ pub fn cat_to_num(text: Vec<String>, alphabet: Vec<String>, char_length: u32) -> /// /// assert_eq!(vec!["meow meow mrrp".to_string(), "meow mreow mrrp".to_string(), "mreow meow mrrp".to_string()], split_every_x("meow meow mrrp meow mreow mrrp mreow meow mrrp".to_string(), 3)); /// ``` -pub fn split_every_x(text: String, x: usize) -> Vec<String> { +pub fn split_every_x(text: String, x: u32) -> Vec<String> { + let x = x as usize; let delim = " "; let tmp: Vec<String> = text.split(delim).map(|item| item.to_string()).collect(); let mut output: Vec<String> = Vec::new();