use pest_derive::Parser; #[derive(Parser)] #[grammar = "parser/deimos.pest"] pub struct DeimosParser; #[cfg(test)] mod deimos_parser_tests { use crate::parser::{DeimosParser, Rule}; use pest::Parser; macro_rules! fail_rule { ($pair: expr; $rule:path) => {{ panic!( "Expected {} but found {:?}", stringify!($rule), $pair.as_rule() ) }}; } macro_rules! match_rule { ($pair:expr; $rule:path) => {{ if $rule != $pair.as_rule() { fail_rule!($pair; $rule); } }}; } fn parses_to(rule: Rule, input: &str) { let parse_result = DeimosParser::parse(rule, input); if let Err(e) = parse_result { panic!("Parsing failed.\n{}", e); } else { let mut pairs = parse_result.unwrap(); if input.trim() != pairs.as_str().trim() { panic!( "Parsing did not consume entire input. Consumed only:\n{}", pairs.as_str() ); } let first = pairs.next().unwrap(); match_rule!(first; rule) } } mod generated_tests { include!(concat!(env!("OUT_DIR"), "/src/parser/tests/test_suites.rs")); } }