pub const INVALID_BYTE: u8 = 0xFF;
pub const PAD_BYTE: u8 = 0xFE;
pub const STANDARD_ENCODE_TABLE: &[u8; 64] =
b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
pub const URL_SAFE_ENCODE_TABLE: &[u8; 64] =
b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
pub const fn make_decode_table(encode_table: &[u8; 64], pad: Option<u8>) -> [u8; 256] {
let mut table = [INVALID_BYTE; 256];
let mut i = 0;
while i < 64 {
table[encode_table[i] as usize] = i as u8;
i += 1;
}
if let Some(pad_char) = pad {
table[pad_char as usize] = PAD_BYTE;
}
table
}
pub static STANDARD_DECODE_TABLE: [u8; 256] = make_decode_table(STANDARD_ENCODE_TABLE, Some(b'='));
pub static URL_SAFE_DECODE_TABLE: [u8; 256] = make_decode_table(URL_SAFE_ENCODE_TABLE, Some(b'='));
pub static URL_SAFE_NO_PAD_DECODE_TABLE: [u8; 256] = make_decode_table(URL_SAFE_ENCODE_TABLE, None);
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Config {
pub encode_table: &'static [u8; 64],
pub decode_table: &'static [u8; 256],
pub padding: bool,
}
impl Config {
pub const STANDARD: Self = Self {
encode_table: STANDARD_ENCODE_TABLE,
decode_table: &STANDARD_DECODE_TABLE,
padding: true,
};
pub const STANDARD_NO_PAD: Self = Self {
encode_table: STANDARD_ENCODE_TABLE,
decode_table: &STANDARD_DECODE_TABLE,
padding: false,
};
pub const URL_SAFE: Self = Self {
encode_table: URL_SAFE_ENCODE_TABLE,
decode_table: &URL_SAFE_DECODE_TABLE,
padding: true,
};
pub const URL_SAFE_NO_PAD: Self = Self {
encode_table: URL_SAFE_ENCODE_TABLE,
decode_table: &URL_SAFE_NO_PAD_DECODE_TABLE,
padding: false,
};
}