1pub mod validadores {
2
3 pub fn cpf(cpf: &str) -> bool {
4 let cpf: String = cpf.chars().filter(|c| c.is_ascii_digit()).collect();
6
7 if cpf.len() != 11 {
9 return false;
10 }
11
12 let numeros: Vec<u32> = cpf.chars().map(|c| c.to_digit(10).unwrap()).collect();
13
14 if numeros.iter().all(|&n| n == numeros[0]) {
16 return false;
17 }
18
19 let soma1: u32 = numeros[..9]
21 .iter()
22 .enumerate()
23 .map(|(i, &n)| n * (10 - i as u32))
24 .sum();
25
26 let resto1 = soma1 % 11;
27 let dv1 = if resto1 < 2 { 0 } else { 11 - resto1 };
28
29 if numeros[9] != dv1 {
30 return false;
31 }
32
33 let soma2: u32 = numeros[..10]
35 .iter()
36 .enumerate()
37 .map(|(i, &n)| n * (11 - i as u32))
38 .sum();
39
40 let resto2 = soma2 % 11;
41 let dv2 = if resto2 < 2 { 0 } else { 11 - resto2 };
42
43 numeros[10] == dv2
44 }
45
46 pub fn cnpj(cnpj: &str) -> bool {
47 let cnpj: String = cnpj.chars().filter(|c| c.is_ascii_digit()).collect();
49
50 if cnpj.len() != 14 {
52 return false;
53 }
54
55 let numeros: Vec<u32> = cnpj
56 .chars()
57 .map(|c| c.to_digit(10).unwrap())
58 .collect();
59
60 if numeros.iter().all(|&n| n == numeros[0]) {
62 return false;
63 }
64
65 let pesos1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
67
68 let soma1: u32 = numeros[..12]
69 .iter()
70 .zip(pesos1.iter())
71 .map(|(&n, &peso)| n * peso)
72 .sum();
73
74 let resto1 = soma1 % 11;
75 let dv1 = if resto1 < 2 { 0 } else { 11 - resto1 };
76
77 if numeros[12] != dv1 {
78 return false;
79 }
80
81 let pesos2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
83
84 let soma2: u32 = numeros[..13]
85 .iter()
86 .zip(pesos2.iter())
87 .map(|(&n, &peso)| n * peso)
88 .sum();
89
90 let resto2 = soma2 % 11;
91 let dv2 = if resto2 < 2 { 0 } else { 11 - resto2 };
92
93 numeros[13] == dv2
94 }
95
96}