regex_parser 0.1.1

This project provides a parser for standard regular expressions based on a defined grammar.
Documentation
use anyhow::anyhow;
use pest::Parser;
use regex_parser::*;

#[cfg(test)]
mod regex_parser_unit_tests {
    use super::*;

    #[test]
    fn test_rsymb_on_correct() -> anyhow::Result<()> {
        let correct_inputs = ["a", "b", ".", "1", "т", "а", "н", "я"];
        for input in correct_inputs {
            let parsed_data = RegexGrammar::parse(Rule::rsymb, input)?
                .next()
                .ok_or_else(|| anyhow!("no needed pair"))?;
            assert_eq!(parsed_data.as_str(), input);
        }
        Ok(())
    }

    #[test]
    fn test_rsymb_on_incorrect() -> anyhow::Result<()> {
        let incorrect_inputs = ["|", "(", ")", "*", "+", "?", ""];
        for input in incorrect_inputs {
            let parsed_result = RegexGrammar::parse(Rule::rsymb, input);
            assert!(
                parsed_result.is_err(),
                "Expected error for input: {}",
                input
            );
        }
        Ok(())
    }

    #[test]
    fn test_prime_on_correct() -> anyhow::Result<()> {
        let correct_inputs = [
            "a", "b", ".", ",", "т", "а", "н", "я", "(a)", "(a|b)", "(a*)", "(a|(b*))",
        ];
        for input in correct_inputs {
            let parsed_data = RegexGrammar::parse(Rule::prime, input)?
                .next()
                .ok_or_else(|| anyhow!("no needed pair"))?;
            assert_eq!(parsed_data.as_str(), input);
        }
        Ok(())
    }

    #[test]
    fn test_prime_on_incorrect() -> anyhow::Result<()> {
        let incorrect_inputs = ["|a", "*b", "?.", "+,", "", "", "(н+(z)", ""];
        for input in incorrect_inputs {
            let parsed_result = RegexGrammar::parse(Rule::prime, input);
            assert!(
                parsed_result.is_err(),
                "Expected error for input: {}",
                input
            );
        }
        Ok(())
    }

    #[test]
    fn test_rfact_on_correct() -> anyhow::Result<()> {
        let correct_inputs = ["a", "b+", ".*", ",?", "(a|t)", "(ab)*", "(a*)?", "(n+|b)+"];
        for input in correct_inputs {
            let parsed_data = RegexGrammar::parse(Rule::rfact, input)?
                .next()
                .ok_or_else(|| anyhow!("no needed pair"))?;
            assert_eq!(parsed_data.as_str(), input);
        }
        Ok(())
    }

    #[test]
    fn test_rfact_on_incorrect() -> anyhow::Result<()> {
        let incorrect_inputs = ["|a", "*b", "?.", "+,", "", "", "(н+(z)", ""];
        for input in incorrect_inputs {
            let parsed_result = RegexGrammar::parse(Rule::rfact, input);
            assert!(
                parsed_result.is_err(),
                "Expected error for input: {}",
                input
            );
        }
        Ok(())
    }

    #[test]
    fn test_rterm_on_correct() -> anyhow::Result<()> {
        let correct_inputs = [
            "ab", "b+a", "bab*", "a*b?", "(a|t)", "(ab)b", "(a*)?", "(n+|b)+", "a(b+)",
        ];
        for input in correct_inputs {
            let parsed_data = RegexGrammar::parse(Rule::rterm, input)?
                .next()
                .ok_or_else(|| anyhow!("no needed pair"))?;
            assert_eq!(parsed_data.as_str(), input);
        }
        Ok(())
    }

    #[test]
    fn test_rterm_on_incorrect() -> anyhow::Result<()> {
        let incorrect_inputs = [
            "|a", "*b", "?.", "+,", "", "", "(н+(z)", "(a|())", "(ab+",
        ];
        for input in incorrect_inputs {
            let parsed_result = RegexGrammar::parse(Rule::rterm, input);
            assert!(
                parsed_result.is_err(),
                "Expected error for input: {}",
                input
            );
        }
        Ok(())
    }

    #[test]
    fn test_rexpr_on_correct() -> anyhow::Result<()> {
        let correct_inputs = ["ab", "b|a", "ba|b*", "(a*)|(b?)"];
        for input in correct_inputs {
            let parsed_data = RegexGrammar::parse(Rule::rexpr, input)?
                .next()
                .ok_or_else(|| anyhow!("no needed pair"))?;
            assert_eq!(parsed_data.as_str(), input);
        }
        Ok(())
    }

    #[test]
    fn test_rexpr_on_incorrect() -> anyhow::Result<()> {
        let incorrect_inputs = [
            "|a", "*b", "?.", "+,", "", "", "(н+(z)", "(a|())", "(ab+",
        ];
        for input in incorrect_inputs {
            let parsed_result = RegexGrammar::parse(Rule::rexpr, input);
            assert!(
                parsed_result.is_err(),
                "Expected error for input: {}",
                input
            );
        }
        Ok(())
    }

    #[test]
    fn test_reg_on_correct() -> anyhow::Result<()> {
        let correct_inputs = [
            "(a|b)*c",
            "(x|y)(1|2)",
            "x'*",
            "(ab|c)*",
            "(a?)a",
            "(ab)?d+",
        ];
        for input in correct_inputs {
            let parsed_data = RegexGrammar::parse(Rule::reg, input)?
                .next()
                .ok_or_else(|| anyhow!("no needed pair"))?;
            assert_eq!(parsed_data.as_str(), input);
        }
        Ok(())
    }

    #[test]
    fn test_reg_on_incorrect() -> anyhow::Result<()> {
        let incorrect_inputs = [
            "", "(", ")", "*", "+", "?", "|", "a||b", "a|", "a**", "a++", "a??", "(a|b|c", "|a|b",
            "a|b+(", "a?*", "ab(+)",
        ];
        for input in incorrect_inputs {
            let parsed_result = RegexGrammar::parse(Rule::reg, input);
            assert!(
                parsed_result.is_err(),
                "Expected error for input: {}",
                input
            );
        }
        Ok(())
    }
}