use base64::{decoded_len_estimate, engine::general_purpose::URL_SAFE_NO_PAD, Engine as _};
use zeroize::Zeroizing;
use crate::Base64UrlError;
pub fn base64url_to_bytes(s: &str) -> Result<Vec<u8>, Base64UrlError> {
base64url_bytes_to_bytes(s.as_bytes())
}
pub fn base64url_bytes_to_bytes(bytes: &[u8]) -> Result<Vec<u8>, Base64UrlError> {
let mut output = Zeroizing::new(vec![0_u8; decoded_len_estimate(bytes.len())]);
let length = URL_SAFE_NO_PAD
.decode_slice(bytes, output.as_mut_slice())
.map_err(|_| Base64UrlError::Invalid)?;
output.truncate(length);
Ok(core::mem::take(&mut *output))
}