basekit 0.5.0

Universal library for encoding in various bases
Documentation
use super::super::config::Base64DecodeConfig;
use super::super::error::Base64Error;
use super::decode_into::decode64_into;
use super::output::Base64DecodeOutput;
use crate::utils::init_vec_with;

#[inline]
pub fn decode64(
    config: &Base64DecodeConfig,
    data: impl AsRef<[u8]>,
) -> Result<Base64DecodeOutput, Base64Error> {
    let data = data.as_ref();

    if data.is_empty() {
        return Ok(Base64DecodeOutput { inner: Vec::new() });
    }

    let mut padding_count = 0;
    if let Some(padding) = config.padding {
        for &byte in data.iter().rev() {
            if byte == padding {
                padding_count += 1;
            } else {
                break;
            }
        }
    }

    if padding_count > 2 {
        return Err(Base64Error::InvalidPadding);
    }

    let clean_len = data.len() - padding_count;

    if clean_len == 0 {
        return Ok(Base64DecodeOutput { inner: Vec::new() });
    }

    let output_len = (clean_len * 3) / 4;

    let output = unsafe { init_vec_with(output_len, |buf| decode64_into(config, buf, data))? };

    Ok(Base64DecodeOutput { inner: output })
}