finances/validator/
luxembourg.rs1use crate::{Citizen, validator};
2use crate::country::Code;
3use crate::validator::algorithms;
4
5pub(crate) struct LuxembourgValidator;
6
7impl validator::CountryValidator for LuxembourgValidator {
15 fn validate_id(&self, id: &str) -> bool {
16 let standard_id = id.replace(" ", "").replace("-", "");
17 if standard_id.len() != 13 {
18 return false;
19 }
20 if !algorithms::validate_luhn_10(&standard_id[0..12]) {
21 return false;
22 }
23
24 return algorithms::validate_verhoeff(&standard_id);
25 }
26
27 fn country_code(&self) -> Code {
28 return crate::country::Code::LU;
29 }
30
31 fn extract_citizen(&self, _id: &str) -> Option<Citizen> {
32 return None;
33 }
34}
35
36#[cfg(test)]
37mod tests {
38 use crate::validator::CountryValidator;
39
40 #[test]
41 fn lu_validator_requires_len_of_13() {
42 let validator = super::validator::luxembourg::LuxembourgValidator;
43 assert_eq!(false, validator.validate_id("123"));
44 assert_eq!(false, validator.validate_id("123-456-7"));
45 }
46
47 #[test]
48 fn lu_validator_invalid_ids() {
49 let validator = super::validator::luxembourg::LuxembourgValidator;
50 assert_eq!(validator.validate_id("1994789587182"), false);
51 assert_eq!(validator.validate_id("5971654782313"), false);
52 assert_eq!(validator.validate_id("2055101054879"), false);
53 assert_eq!(validator.validate_id("1997053045687"), false);
54 }
55
56 #[test]
57 fn lu_validator_valid_ids() {
58 let validator = super::validator::luxembourg::LuxembourgValidator;
59 assert_eq!(validator.validate_id("1983081246783"), true);
60 assert_eq!(validator.validate_id("2003042581931"), true);
61 assert_eq!(validator.validate_id("1971110258746"), true);
62 assert_eq!(validator.validate_id("2012051469336"), true);
63 assert_eq!(validator.validate_id("1994092874551"), true);
64 }
65}
66