#![cfg(feature = "base64")]
use base64ct::{
Base64Bcrypt, Base64Pbkdf2, Base64ShaCrypt, Base64Unpadded as B64, Encoding as _,
Error as B64Error,
};
#[cfg(feature = "alloc")]
use alloc::{string::String, vec::Vec};
#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]
#[non_exhaustive]
pub enum Base64 {
B64,
Bcrypt,
Crypt,
Pbkdf2,
}
impl Base64 {
pub fn decode(self, src: impl AsRef<[u8]>, dst: &mut [u8]) -> Result<&[u8], B64Error> {
match self {
Self::B64 => B64::decode(src, dst),
Self::Bcrypt => Base64Bcrypt::decode(src, dst),
Self::Crypt => Base64ShaCrypt::decode(src, dst),
Self::Pbkdf2 => Base64Pbkdf2::decode(src, dst),
}
}
#[cfg(feature = "alloc")]
pub fn decode_vec(self, input: &str) -> Result<Vec<u8>, B64Error> {
match self {
Self::B64 => B64::decode_vec(input),
Self::Bcrypt => Base64Bcrypt::decode_vec(input),
Self::Crypt => Base64ShaCrypt::decode_vec(input),
Self::Pbkdf2 => Base64Pbkdf2::decode_vec(input),
}
}
pub fn encode<'a>(self, src: &[u8], dst: &'a mut [u8]) -> Result<&'a str, B64Error> {
match self {
Self::B64 => B64::encode(src, dst),
Self::Bcrypt => Base64Bcrypt::encode(src, dst),
Self::Crypt => Base64ShaCrypt::encode(src, dst),
Self::Pbkdf2 => Base64Pbkdf2::encode(src, dst),
}
.map_err(Into::into)
}
#[cfg(feature = "alloc")]
pub fn encode_string(self, input: &[u8]) -> String {
match self {
Self::B64 => B64::encode_string(input),
Self::Bcrypt => Base64Bcrypt::encode_string(input),
Self::Crypt => Base64ShaCrypt::encode_string(input),
Self::Pbkdf2 => Base64Pbkdf2::encode_string(input),
}
}
pub fn encoded_len(self, bytes: &[u8]) -> usize {
match self {
Self::B64 => B64::encoded_len(bytes),
Self::Bcrypt => Base64Bcrypt::encoded_len(bytes),
Self::Crypt => Base64ShaCrypt::encoded_len(bytes),
Self::Pbkdf2 => Base64Pbkdf2::encoded_len(bytes),
}
}
}