icydb_model/base/normalizer/intl/
phone.rs1use crate::{prelude::*, visitor::Normalizer};
8
9#[normalizer]
15pub struct E164PhoneNumber;
16
17impl Normalizer<String> for E164PhoneNumber {
18 fn normalize(&self, value: &mut String) -> Result<(), String> {
19 let trimmed = value.trim();
20
21 if trimmed.is_empty() || trimmed.starts_with('+') {
22 *value = trimmed.to_owned();
23 return Ok(());
24 }
25
26 if trimmed.chars().all(|c| c.is_ascii_digit()) {
27 *value = format!("+{trimmed}");
28 return Ok(());
29 }
30
31 *value = trimmed.to_owned();
32
33 Ok(())
34 }
35}
36
37#[cfg(test)]
42mod tests;