phone_parser 0.1.0

Parser which can parse phone numbers
Documentation
pub use pest_derive::Parser;
pub use pest::Parser;
use anyhow::anyhow;

  #[derive(Parser)]
  #[grammar = "grammar.pest"]
  struct PhoneNumberParser;


peg::parser! {
        pub grammar phone_number_parser() for str {
            rule digit() -> char
                = ['0'..='9']
    
            pub rule digits() -> &'input str
                = s:$(['0'..='9']+) { s }
    
            pub rule phone_number() -> bool
                = "+" "38" digits() { true }
                / { false }
        }
}



#[cfg(test)]
mod tests {

    use super::*;


    #[test]
    fn test_valid_phone_numbers() -> anyhow::Result<()> {
      let pair = PhoneNumberParser::parse(Rule::phoneNumber, "+380992121211")?.next().ok_or_else(|| anyhow!("no pair"))?;

      assert_eq!( pair.as_span().start(), 0 );
      assert_eq!( pair.as_span().end(), 13 );
        Ok(())
    }

    #[test]
    fn test_valid_phone_numbers_fail() -> anyhow::Result<()> {
      let pair = PhoneNumberParser::parse(Rule::phoneNumber, "380992121211");

      assert!( pair.is_err() );
    Ok(())
    }

    #[test]
    fn test_valid_phone_numbers_fail_lenght() -> anyhow::Result<()> {
      let pair = PhoneNumberParser::parse(Rule::phoneNumber, "+380992121")?.next().ok_or_else(|| anyhow!("no pair"))?;

      assert_eq!( pair.as_span().start(), 0 );
      assert_eq!( pair.as_span().end(), 13, "Must be +38 and 10 digits in lenght!" );
        Ok(())
    }

}