use crate::{consts, parser::helper::*};
use nom::{branch::*, combinator::*, multi::*, IResult};
pub fn phone_number(i: &str) -> IResult<&str, &str> {
parse! { i => recognize(alt((short, long))) }
}
fn short(i: &str) -> IResult<&str, ()> {
parse! { i =>
count(digit, consts::MIN_LENGTH_FOR_NSN);
ieof;
};
Ok((i, ()))
}
fn long(i: &str) -> IResult<&str, ()> {
fn first_group(i: &str) -> IResult<&str, ()> {
parse! { i =>
many0(alt((punctuation, star)));
count(digit, 1);
};
Ok((i, ()))
}
parse! { i =>
many0(plus);
count(first_group, 3);
many0(alt((punctuation, star, digit)));
many0(alt((punctuation, star, digit, alpha)));
ieof;
};
Ok((i, ()))
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn phone() {
assert!(phone_number("1").is_err());
assert!(phone_number("1+1+1").is_err());
assert!(phone_number("80+0").is_err());
assert!(phone_number("00").is_ok());
assert!(phone_number("111").is_ok());
assert!(phone_number("0800-4-pizza").is_ok());
assert!(phone_number("0800-4-PIZZA").is_ok());
assert!(phone_number("08-PIZZA").is_err());
assert!(phone_number("8-PIZZA").is_err());
assert!(phone_number("12. March").is_err());
assert!(phone_number("1110@gmail.com").is_err());
}
}