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
use Transformer;
use transformer::{
    TransformResultHelper,
    TransformResult
};

use regex::Regex;

lazy_static! {
    static ref ZIP_REGEX: Regex = Regex::new(r"\A(\d{5})\D*(?:(\d{4}))?\z").unwrap();
}

#[derive(Serialize, Deserialize, PartialEq, Eq, Hash, Clone, Debug)]
pub struct ZipcodeTransformer { }

impl ZipcodeTransformer {
    pub fn new() -> ZipcodeTransformer {
        ZipcodeTransformer { }
    }
}

impl Transformer for ZipcodeTransformer {
    fn transform(&self, field_value: &str, field_name: &str, record_n: usize) -> TransformResult {
        if let Some(captures) = ZIP_REGEX.captures(field_value) {
            let base_code = captures.get(1).unwrap();
            let plus_four_code = captures.get(2);
            let zipcode = if let Some(pfc) = plus_four_code {
                format!("{}-{}", base_code.as_str(), pfc.as_str())
            } else {
                base_code.as_str().to_string()
            };
            TransformResult::present(&zipcode)
        } else {
            TransformResult::error(field_value, field_name, record_n, "not a valid zipcode")
        }
    }
}