use crate::charsets::{get_charset, MAX};
use crate::errors::{OdoError, OverflowError, UnsupportedLengthError};
#[inline]
pub fn assert_length(length: usize) -> Result<(), UnsupportedLengthError> {
if matches!(length, 6 | 7 | 8) {
Ok(())
} else {
Err(UnsupportedLengthError { length })
}
}
pub fn encode(n: u64, length: usize) -> Result<String, OdoError> {
assert_length(length)?;
if n >= MAX[length] {
return Err(OdoError::Overflow(OverflowError {
n,
length,
max: MAX[length],
}));
}
let mut buf = vec![0u8; length];
let mut n = n;
for i in (0..length).rev() {
let charset = get_charset(i);
let base = charset.len() as u64;
buf[i] = charset[(n % base) as usize];
n /= base;
}
Ok(String::from_utf8(buf).expect("charset bytes are always valid ASCII"))
}