use crate::charsets::get_charset;
use crate::encode::assert_length;
use crate::errors::{InvalidCharacterError, OdoError};
pub fn decode(id: &str) -> Result<u64, OdoError> {
if id.is_empty() {
return Err(OdoError::EmptyInput);
}
let upper = id.to_uppercase();
let length = upper.len();
assert_length(length)?;
let bytes = upper.as_bytes();
let mut n: u64 = 0;
for (i, &byte) in bytes.iter().enumerate() {
let charset = get_charset(i);
let base = charset.len() as u64;
let v = charset.iter().position(|&c| c == byte).ok_or_else(|| {
OdoError::InvalidCharacter(InvalidCharacterError {
ch: byte as char,
position: i + 1,
})
})?;
n = n * base + v as u64;
}
Ok(n)
}