bin_encode_decode/encode/func.rs
1use crate::*;
2
3/// Encodes a given input string into an encoded format using a specified character set (`charset`).
4/// This function groups bytes in chunks of 3 and maps them into 4-character segments based on `charset`.
5///
6/// # Parameters
7/// - `charset`: A string representing the character set to use for encoding. Each character
8/// in `charset` should have a unique position to ensure accurate encoding.
9/// - `encode_str`: The input string to encode. It will be converted to bytes and processed
10/// in 3-byte chunks.
11///
12/// # Returns
13/// Returns a `Result` containing the encodeed `String` if successful, or a `EncodeError` if the charset is invalid.
14///
15/// # Example
16/// ```
17/// use bin_encode_decode::*;
18///
19/// let charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_=";
20/// let original_str = "test";
21/// let encoded_str = encode(charset, original_str);
22/// assert_eq!(encoded_str.unwrap(), "aab0aabLaabZaab0");
23/// ```
24#[inline]
25pub fn encode(charset: &str, encode_str: &str) -> Result<String, EncodeError> {
26 if !Endecode::judge_charset_safe(charset) {
27 return Err(EncodeError::CharsetError);
28 }
29 let mut result: String = String::new();
30 let mut buffer: Vec<u8> = Vec::new();
31 for &byte in encode_str.as_bytes() {
32 buffer.extend_from_slice(&[0, 0, byte]);
33 }
34 for chunk in buffer.chunks(3) {
35 let combined: usize =
36 ((chunk[0] as usize) << 16) | ((chunk[1] as usize) << 8) | (chunk[2] as usize);
37 for i in (0..4).rev() {
38 let idx: usize = (combined >> (i * 6)) & 0b111111;
39 result.push(charset.chars().nth(idx).unwrap_or_default());
40 }
41 }
42 Ok(result)
43}