postal_code/
validator.rs

1crate::ix!();
2
3/// Trait that all country-specific postal code validators must implement.
4pub trait PostalCodeValidator {
5    fn validate(&self, code: &str) -> bool;
6}
7
8/// Macro to define validators easily:
9#[macro_export] macro_rules! generate_postal_code_validator {
10    ($name:ident, $country:expr, $regex:ident) => {
11        pub struct $name;
12
13        impl PostalCodeValidator for $name {
14            fn validate(&self, code: &str) -> bool {
15                $regex.as_ref().map_or(false, |r| r.is_match(code))
16            }
17        }
18    };
19}
20
21generate_postal_code_validator!{
22    UsaValidator, 
23    Country::USA, 
24    REGEX_USA
25}
26
27generate_postal_code_validator!{
28    CanadaValidator, 
29    Country::Canada, 
30    REGEX_Canada
31}
32
33generate_postal_code_validator!{
34    UkValidator, 
35    Country::UnitedKingdom, 
36    REGEX_UnitedKingdom
37}
38
39generate_postal_code_validator!{
40    FranceValidator, 
41    Country::France, 
42    REGEX_France
43}
44
45generate_postal_code_validator!{
46    GermanyValidator, 
47    Country::Germany, 
48    REGEX_Germany
49}
50
51generate_postal_code_validator!{
52    ItalyValidator, 
53    Country::Italy, 
54    REGEX_Italy
55}
56
57pub trait GetPostalCodeValidator {
58
59    fn get_postal_code_validator(&self) 
60        -> Option<Box<dyn PostalCodeValidator + Send + Sync>>;
61}
62
63impl GetPostalCodeValidator for Country {
64
65    /// Return a validator for the given country if supported.
66    fn get_postal_code_validator(&self) 
67        -> Option<Box<dyn PostalCodeValidator + Send + Sync>> 
68    {
69        match self {
70            Country::USA           => Some(Box::new(UsaValidator)),
71            Country::Canada        => Some(Box::new(CanadaValidator)),
72            Country::UnitedKingdom => Some(Box::new(UkValidator)),
73            Country::France        => Some(Box::new(FranceValidator)),
74            Country::Germany       => Some(Box::new(GermanyValidator)),
75            Country::Italy         => Some(Box::new(ItalyValidator)),
76            _                      => None, // Unsupported countries return None
77        }
78    }
79}