validador_crate_rust/
lib.rs1pub mod validadores {
2 pub fn cpf(cpf: &str) -> bool {
3 let cpf: Vec<u8> = cpf
4 .chars()
5 .filter_map(|c| c.to_digit(10))
6 .map(|d| d as u8)
7 .collect();
8
9 if cpf.len() != 11 || cpf.iter().all(|&d| d == cpf[0]) {
10 return false;
11 }
12
13 let mut soma = 0;
14 for i in 0..9 {
15 soma += (cpf[i] as usize) * (10 - i);
16 }
17 let resto = (soma * 10) % 11;
18 let primeiro_digito = if resto == 10 { 0 } else { resto as u8 };
19
20 soma = 0;
21 for i in 0..10 {
22 soma += (cpf[i] as usize) * (11 - i);
23 }
24 let resto = (soma * 10) % 11;
25 let segundo_digito = if resto == 10 { 0 } else { resto as u8 };
26
27 primeiro_digito == cpf[9] && segundo_digito == cpf[10]
28 }
29
30 pub fn cnpj(cnpj: &str) -> bool {
31 let vec: Vec<u8> = cnpj
32 .chars()
33 .filter_map(|c| c.to_digit(10))
34 .map(|d| d as u8)
35 .collect();
36
37 if vec.len() != 14 || vec.iter().all(|&d| d == vec[0]) {
38 return false;
39 }
40
41 let validate_digit = |digit: usize| -> bool {
42 let mut sum = 0;
43 let mut weight = digit - 7;
44 for &num in vec.iter().take(digit) {
45 sum += num as usize * weight;
46 weight = if weight == 2 { 9 } else { weight - 1 };
47 }
48 let remainder = sum % 11;
49 let digit = if remainder < 2 { 0 } else { 11 - remainder };
50 digit == vec[digit - 1] as usize
51 };
52
53 validate_digit(13) && validate_digit(14)
54 }
55}