1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
use rand::Rng;

pub fn validate(tc: &String) -> bool {
    let parts = number_to_vec(&tc);
    
    if parts.len() < 11 {
        return false
    }

    let even: u32 = parts.iter().take(9).step_by(2).sum();
    let odd: u32 = parts[1..9].iter().step_by(2).sum();
  
    let ten: u32 = ( even * 7 - odd) % 10;

    if parts.get(9).is_none() || parts[9] != ten {
        return false
    }

    let eleven: u32 = parts[0..10].iter().sum::<u32>() % 10;

    if parts.get(10).is_none() || parts[10] != eleven {
        return false
    }

    true
}
pub fn generate() -> String {
    let mut rng = rand::thread_rng();
    let random: u32 = rng.gen_range(100000000, 999999999);
    let parts = number_to_vec(&random.to_string());
    let even: u32 = parts.iter().take(9).step_by(2).sum();
    let odd: u32 = parts[1..9].iter().step_by(2).sum();
    let ten: u32 = ( even * 7 - odd) % 10;
    let new_number = format!("{}{}", random, ten);
    let new_parts = number_to_vec(&new_number);
    let eleven: u32 = new_parts[0..10].iter().sum::<u32>() % 10;
    return format!("{}{}{}", random, ten, eleven)
}

fn number_to_vec(n: &String) -> Vec<u32> {
    n.trim().chars()
    .map(|c| c.to_digit(10).unwrap())
    .collect()
}