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
38
39
40
41
42
43
44
45
46
#[must_use]
pub fn validate_phone<T>(phone_number: T) -> bool
where
    T: AsRef<str>,
{
    if let Ok(parsed) = phonenumber::parse(None, phone_number) {
        phonenumber::is_valid(&parsed)
    } else {
        false
    }
}

#[cfg(test)]
mod tests {
    use super::validate_phone;

    #[test]
    fn test_phone() {
        let tests = vec![
            ("+1 (415) 237-0800", true),
            ("+14152370800", true),
            ("+33642926829", true),
            ("14152370800", false),
            ("0642926829", false),
            ("00642926829", false),
            ("A012", false),
            ("TEXT", false),
        ];

        for (input, expected) in tests {
            assert_eq!(validate_phone(input), expected);
        }
    }

    #[test]
    fn test_phone_cow() {
        let test = "+1 (415) 237-0800";
        assert!(validate_phone(test));
        let test = String::from("+1 (415) 237-0800");
        assert!(validate_phone(test));
        let test = "TEXT";
        assert!(!validate_phone(test));
        let test = String::from("TEXT");
        assert!(!validate_phone(test));
    }
}