validador_crate_rust/
lib.rs

1pub 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}