#![allow(clippy::cast_possible_truncation)]
use crate::errors::{DecodeError, InvalidSuffixReason};
const ENCODE_TABLE: &[u8; 32] = b"0123456789abcdefghjkmnpqrstvwxyz";
pub const DECODE_TABLE: [u8; 256] = {
let mut table = [0xFF; 256];
let mut i = 0;
while i < 32 {
table[ENCODE_TABLE[i] as usize] = i as u8;
i += 1;
}
table
};
pub fn encode_base32(uuid: &[u8; 16]) -> [u8; 26] {
let mut uuid_int = u128::from_be_bytes(*uuid);
let mut encoded_output = [0u8; 26];
for index in (0..26).rev() {
encoded_output[index] = ENCODE_TABLE[(uuid_int & 0x1F) as usize];
uuid_int >>= 5;
}
encoded_output
}
pub fn decode_base32(encoded: &[u8; 26]) -> Result<[u8; 16], DecodeError> {
let mut uuid_int = 0u128;
for &character in encoded {
let value = DECODE_TABLE[character as usize];
if value == 0xFF {
return Err(DecodeError::InvalidSuffix(InvalidSuffixReason::InvalidCharacter));
}
uuid_int = (uuid_int << 5) | u128::from(value);
}
Ok(uuid_int.to_be_bytes())
}