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
use Transformer; use transformer::{ TransformResultHelper, TransformResult }; use regex::Regex; lazy_static! { static ref NANP_REGEX: Regex = Regex::new(r"\A(?:\+?1)?\D*\(?(?P<area>\d{3})\)?\D*(?P<exchange>\d{3})\D*(?P<subscriber>\d{4})\z").unwrap(); } #[derive(Serialize, Deserialize, PartialEq, Eq, Hash, Clone, Debug)] pub struct PhoneNumberTransformer { } impl PhoneNumberTransformer { pub fn expect_nanp_format() -> PhoneNumberTransformer { PhoneNumberTransformer { } } } impl Transformer for PhoneNumberTransformer { fn transform(&self, field_value: &str, field_name: &str, record_n: usize) -> TransformResult { if let Some(captures) = NANP_REGEX.captures(field_value) { let area_code = captures.name("area").unwrap().as_str(); let exchange_code = captures.name("exchange").unwrap().as_str(); let subscriber_number = captures.name("subscriber").unwrap().as_str(); let phone_number = format!("+1 {} {} {}", area_code, exchange_code, subscriber_number); TransformResult::present(&phone_number) } else { TransformResult::error(field_value, field_name, record_n, "not a valid NANP format phone number") } } }