use num_bigint::BigUint;
use crate::alphabet::Alphabet;
use crate::error::ObfuskeyError;
pub fn decode_u128(value: &str, alphabet: &Alphabet) -> Result<Option<u128>, ObfuskeyError> {
let base = alphabet.base() as u128;
let mut result: u128 = 0;
for c in value.chars() {
let idx = alphabet
.index_of(c)
.ok_or(ObfuskeyError::UnknownKeyError)? as u128;
result = match result.checked_mul(base) {
Some(v) => match v.checked_add(idx) {
Some(v) => v,
None => return Ok(None),
},
None => return Ok(None),
};
}
Ok(Some(result))
}
pub fn decode_big(value: &str, alphabet: &Alphabet) -> Result<BigUint, ObfuskeyError> {
let base = BigUint::from(alphabet.base());
let mut result = BigUint::ZERO;
for c in value.chars() {
let idx = alphabet
.index_of(c)
.ok_or(ObfuskeyError::UnknownKeyError)?;
result = result * &base + BigUint::from(idx);
}
Ok(result)
}