use crate::*;
impl Decode {
pub fn execute(charset: &str, decode_str: &str) -> Result<String, DecodeError> {
if !Charset::judge_charset_safe(charset) {
return Err(DecodeError::CharsetError);
}
let mut buffer: Vec<u8> = Vec::new();
let mut decoded: Vec<u8> = Vec::new();
for ch in decode_str.chars() {
if let Some(idx) = charset.chars().position(|c| c == ch) {
buffer.push(idx as u8);
}
if buffer.len() == 4 {
let combined: usize = ((buffer[0] as usize) << 18)
| ((buffer[1] as usize) << 12)
| ((buffer[2] as usize) << 6)
| (buffer[3] as usize);
decoded.push((combined >> 16) as u8);
decoded.push((combined >> 8) as u8);
decoded.push(combined as u8);
buffer.clear();
}
}
let decode_res: String =
String::from_utf8(decoded.into_iter().filter(|&x| x != 0).collect())
.unwrap_or_default();
Ok(decode_res)
}
}