1crate::ix!();
2
3pub trait PostalCodeValidator {
5 fn validate(&self, code: &str) -> bool;
6}
7
8#[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 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, }
78 }
79}