Skip to main content

rust_validador/
lib.rs

1pub mod validadores {
2
3    pub fn cpf(cpf: &str) -> bool {
4        // Remove caracteres que não são números
5        let cpf: String = cpf.chars().filter(|c| c.is_ascii_digit()).collect();
6
7        // CPF deve ter 11 dígitos
8        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        // Rejeita CPFs com todos os dígitos iguais
15        if numeros.iter().all(|&n| n == numeros[0]) {
16            return false;
17        }
18
19        // Primeiro dígito verificador
20        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        // Segundo dígito verificador
34        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        // Remove caracteres que não são números
48        let cnpj: String = cnpj.chars().filter(|c| c.is_ascii_digit()).collect();
49
50        // CNPJ deve ter 14 dígitos
51        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        // Rejeita CNPJs com todos os dígitos iguais
61        if numeros.iter().all(|&n| n == numeros[0]) {
62            return false;
63        }
64
65        // Primeiro dígito verificador
66        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        // Segundo dígito verificador
82        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}