codice_fiscale_rs/
control_code.rs

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