finances/validator/
luxembourg.rs

1use crate::{Citizen, validator};
2use crate::country::Code;
3use crate::validator::algorithms;
4
5pub(crate) struct LuxembourgValidator;
6
7/**
8 Luxembourg National Identifier Number code validation.
9
10 TIN validation logic source: https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Luxembourg-TIN.pdf
11
12 Another (english) version for the validation can be viewed in wikipedia: https://en.wikipedia.org/wiki/National_identification_number#Luxembourg
13**/
14impl 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