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}