pub fn mod_11(value: u32) -> usize {
match value % 11 {
10 => 0,
dv => dv as usize,
}
}
pub fn onze_menos_mod11(value: u32) -> u32 {
let res = 11 - value % 11;
if res > 9 {
0
} else {
res
}
}
pub fn calc_digito(
digitos: Vec<u32>,
multiplicadores: Vec<u32>,
funcao_modulo: fn(x: u32) -> u32,
) -> u32 {
assert_eq!(digitos.len(), multiplicadores.len());
let result: u32 = digitos
.iter()
.enumerate()
.map(|(index, value)| multiplicadores[index] * value)
.sum();
funcao_modulo(result)
}
pub fn calc_digito_mod11(digitos: Vec<u32>, multiplicadores: Vec<u32>) -> u32 {
assert_eq!(digitos.len(), multiplicadores.len());
let result: u32 = digitos
.iter()
.enumerate()
.map(|(index, value)| multiplicadores[index] * value)
.sum();
mod_11(result) as u32
}
pub fn somente_digitos(doc: &str, n: usize) -> Vec<u32> {
doc.chars()
.filter(|c| c.is_ascii_digit())
.map(|x| x.to_digit(10).unwrap())
.take(n)
.collect()
}
pub fn completa_esquerda(numero: &mut Vec<u32>, n: usize) {
if numero.len() < n {
for _ in 0..(n - numero.len()) {
numero.insert(0, 0);
}
};
}