Skip to main content

mist_parser/parser/
mod.rs

1pub mod common;
2pub mod items;
3
4use crate::{Rule, ast::Spanned, error::AstError};
5
6pub fn listen_rule(pairs: &mut pest::iterators::Pairs<'_, Rule>, rule: Rule) -> bool {
7    let consumed = pairs
8        .peek()
9        .map(|p| p.as_rule() == rule)
10        .unwrap_or_default();
11
12    if consumed {
13        pairs.next();
14    }
15
16    consumed
17}
18
19pub fn consume_rule<'a>(
20    pairs: &mut pest::iterators::Pairs<'a, Rule>,
21    rule: Rule,
22) -> Option<pest::iterators::Pair<'a, Rule>> {
23    let consumed = pairs
24        .peek()
25        .map(|p| p.as_rule() == rule)
26        .unwrap_or_default();
27
28    if consumed { pairs.next() } else { None }
29}
30
31impl<'a, T: TryFrom<pest::iterators::Pair<'a, Rule>, Error = AstError<'a, T>>>
32    TryFrom<pest::iterators::Pair<'a, Rule>> for Spanned<T>
33{
34    type Error = AstError<'a, Self>;
35
36    fn try_from(pair: pest::iterators::Pair<'a, Rule>) -> Result<Self, Self::Error> {
37        let span = pair.as_span().start_pos().line_col();
38
39        Ok(Self {
40            line: span.0,
41            column: span.1,
42            item: pair.try_into().map_err(|err: AstError<'_, T>| AstError {
43                span: err.span,
44                error_code: err.error_code,
45                error_message: err.error_message,
46                recovered: err.recovered.map(|v| Spanned {
47                    line: span.0,
48                    column: span.1,
49                    item: v,
50                }),
51            })?,
52        })
53    }
54}