microcad_lang/parse/
find_rule.rs1use crate::parse::*;
5
6pub fn find_rule<T: crate::parser::Parse>(
12 pair: &crate::parser::Pair<'_>,
13 rule: crate::parser::Rule,
14 def: Option<T>,
15) -> ParseResult<T> {
16 match pair
17 .inner()
18 .find(|pair| pair.as_rule() == rule)
19 .map(T::parse)
20 {
21 Some(Ok(stmts)) => Ok(stmts),
22 Some(Err(err)) => Err(err),
23 None => {
24 if let Some(def) = def {
25 Ok(def)
26 } else {
27 Err(ParseError::NotAvailable(pair.clone().into()))
28 }
29 }
30 }
31}
32
33#[macro_export]
35macro_rules! find_rule {
36 ($pair:ident, $rule:ident) => {
37 find_rule(&$pair, Rule::$rule, Some(Default::default()))
38 };
39}
40
41#[macro_export]
43macro_rules! find_rule_opt {
44 ($pair:ident, $rule:ident) => {
45 match find_rule(&$pair, Rule::$rule, None) {
46 Ok(t) => Ok(Some(t)),
47 Err(ParseError::NotAvailable(_)) => Ok(None),
48 Err(e) => Err(e),
49 }
50 };
51}
52
53#[macro_export]
55macro_rules! find_rule_exact {
56 ($pair:ident, $rule:ident) => {
57 find_rule(&$pair, Rule::$rule, None)
58 };
59}