validador_cpf/
lib.rs

1pub fn validar_cpf(cpf: &str) -> bool {
2    let cpf: Vec<u8> = cpf
3        .chars()
4        .filter(|c| c.is_digit(10))
5        .map(|c| c.to_digit(10).unwrap() as u8)
6        .collect();
7
8    if cpf.len() != 11 || cpf.iter().all(|&digit| digit == cpf[0]) {
9        return false;
10    }
11
12    let mut sum1 = 0;
13    let mut sum2 = 0;
14
15    for i in 0..9 {
16        sum1 += (cpf[i] as usize) * (10 - i);
17        sum2 += (cpf[i] as usize) * (11 - i);
18    }
19
20    sum2 += cpf[9] as usize * 2;
21
22    let digit1 = (sum1 * 10) % 11 % 10;
23    let digit2 = (sum2 * 10) % 11 % 10;
24
25    cpf[9] == digit1 as u8 && cpf[10] == digit2 as u8
26}
27
28pub fn formatar_cpf(cpf: &str) -> String {
29    format!("{}", cpf)
30}
31
32#[cfg(test)]
33mod tests {
34    use super::*;
35
36    #[test]
37    fn testa_cpf_valido(){
38        assert!(validar_cpf("973.465.310-51"));
39    }
40
41    #[test]
42    fn testa_cpf_invalido(){
43        assert_eq!(validar_cpf("973.465.310-52"), false);
44    }
45
46    #[test]
47    fn testa_cpf_valido_sem_mascara(){
48        assert_eq!(validar_cpf("97346531051"), true);
49    }
50
51    #[test]
52    fn testa_cpf_invalido_sem_mascara(){
53        assert_eq!(validar_cpf("97346531052"), false);
54    }
55
56    #[test]
57    fn testa_cpf_valido_com_mascara_invalida(){
58        assert_eq!(validar_cpf("973465-310-51"), true);
59    }
60
61    #[test]
62    fn testa_cpf_invalido_com_mascara_invalida(){
63        assert_eq!(validar_cpf("973465-310-52"), false);
64    }
65
66    #[test]
67    fn testa_cpf_vazio(){
68        assert_eq!(validar_cpf(""), false);
69    }
70
71    #[test]
72    fn testa_cpf_incompleto(){
73        assert_eq!(validar_cpf("97346531"), false);
74    }
75
76    #[test]
77    fn testa_cpf_com_numero_sequencial_1(){
78        assert_eq!(validar_cpf("111.111.111-11"), false);
79    }
80
81    #[test]
82    fn testa_cpf_com_numero_sequencial_1_sem_mascara(){
83        assert_eq!(validar_cpf("11111111111"), false);
84    }
85
86    #[test]
87    fn testa_cpf_com_numero_sequencial_2_sem_mascara(){
88        assert_eq!(validar_cpf("22222222222"), false);
89    }
90}