enid 0.1.0

A library to parse Encrypted Numeric Identifiers
Documentation
use crate::enid::EnidParseError;

const CHARS: [u8; 32] = *b"0123456789abcdefghjkmnpqrstvwxyz";

const VALUES: [u8; 256] = {
    let mut values = [0xff; 256];
    let mut i = 0;

    while i < CHARS.len() {
        let idx = CHARS[i] as usize;

        assert!(values[idx] == 0xff);
        values[idx] = i as u8;

        i += 1;
    }

    values
};

pub(crate) const fn encode(bytes: [u8; 5]) -> [u8; 8] {
    let bytes = [bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], 0, 0, 0];

    let mut bits = u64::from_be_bytes(bytes);
    let mut chars = [0; 8];

    let mut i = 0;
    while i < 8 {
        chars[i] = CHARS[(bits >> 59) as usize];
        bits <<= 5;

        i += 1;
    }

    chars
}

pub(crate) const fn decode(chars: [u8; 8]) -> Result<[u8; 5], EnidParseError> {
    let mut bits: u64 = 0;

    let mut i = 0;
    while i < 8 {
        let b = VALUES[chars[i] as usize];

        if b == 0xff {
            return Err(EnidParseError);
        }

        bits <<= 5;
        bits |= b as u64;
        i += 1;
    }

    let bytes = bits.to_be_bytes();

    Ok([bytes[3], bytes[4], bytes[5], bytes[6], bytes[7]])
}