codice_fiscale_rs/
control_code.rs1const ALPHABET: &[char] = &[
2 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
3 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
4];
5
6pub struct ControlCode {}
7
8impl ControlCode {
9 pub fn compute(codice_fiscale: &str) -> char {
10 let partial_code: Vec<char> = codice_fiscale.to_uppercase().chars().collect();
11 let mut control_code = 0;
12
13 for (n, character) in partial_code.iter().enumerate().take(15) {
14 if let Some(val) = get_conversion_table_value(character, (n + 1) % 2 == 0) {
15 control_code += val;
16 }
17 }
18
19 let index_alphabet: usize = (&control_code % 26).try_into().unwrap();
20 ALPHABET[index_alphabet]
21 }
22}
23
24fn get_conversion_table_value(character: &char, even: bool) -> Option<i32> {
25 let ternary = |even_value: i32, odd_value: i32| {
26 if even {
27 Some(even_value)
28 } else {
29 Some(odd_value)
30 }
31 };
32
33 match character.to_owned() {
34 'A' | '0' => ternary(0, 1),
35 'B' | '1' => ternary(1, 0),
36 'C' | '2' => ternary(2, 5),
37 'D' | '3' => ternary(3, 7),
38 'E' | '4' => ternary(4, 9),
39 'F' | '5' => ternary(5, 13),
40 'G' | '6' => ternary(6, 15),
41 'H' | '7' => ternary(7, 17),
42 'I' | '8' => ternary(8, 19),
43 'J' | '9' => ternary(9, 21),
44 'K' => ternary(10, 2),
45 'L' => ternary(11, 4),
46 'M' => ternary(12, 18),
47 'N' => ternary(13, 20),
48 'O' => ternary(14, 11),
49 'P' => ternary(15, 3),
50 'Q' => ternary(16, 6),
51 'R' => ternary(17, 8),
52 'S' => ternary(18, 12),
53 'T' => ternary(19, 14),
54 'U' => ternary(20, 16),
55 'V' => ternary(21, 10),
56 'W' => ternary(22, 22),
57 'X' => ternary(23, 25),
58 'Y' => ternary(24, 24),
59 'Z' => ternary(25, 23),
60 _ => None,
61 }
62}