mist_parser/parser/
mod.rs1pub 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}