use crate::constants::ALPHABET;
pub fn encode(input: &[u8]) -> String {
if input.is_empty() {
return String::new();
}
let mut output = String::with_capacity(input.len() * 4 / 3 + 4);
for chunk in input.chunks(3) {
match chunk.len() {
3 => {
let val = ((chunk[0] as u32) << 16) | ((chunk[1] as u32) << 8) | (chunk[2] as u32);
let mut n = val;
let d3 = n % 67;
n /= 67;
let d2 = n % 67;
n /= 67;
let d1 = n % 67;
n /= 67;
let d0 = n % 67;
output.push(ALPHABET[d0 as usize] as char);
output.push(ALPHABET[d1 as usize] as char);
output.push(ALPHABET[d2 as usize] as char);
output.push(ALPHABET[d3 as usize] as char);
}
2 => {
let val = ((chunk[0] as u32) << 8) | (chunk[1] as u32);
let mut n = val;
let d2 = n % 67;
n /= 67;
let d1 = n % 67;
n /= 67;
let d0 = n % 67;
output.push(ALPHABET[d0 as usize] as char);
output.push(ALPHABET[d1 as usize] as char);
output.push(ALPHABET[d2 as usize] as char);
output.push('=');
}
1 => {
let val = chunk[0] as u32;
let mut n = val;
let d1 = n % 67;
n /= 67;
let d0 = n % 67;
output.push(ALPHABET[d0 as usize] as char);
output.push(ALPHABET[d1 as usize] as char);
output.push('=');
output.push('=');
}
_ => unreachable!(),
}
}
output
}