pest_consume/
parser.rs

1use crate::{Error, Nodes};
2use pest::Parser as PestParser;
3use pest::RuleType;
4
5/// A trait that provides methods to parse strings.
6/// Do not implement manually; instead use the [`parser`] macro provided by this crate.
7///
8/// [`parser`]: macro@crate::parser
9pub trait Parser {
10    type Rule: RuleType;
11    #[doc(hidden)]
12    type AliasedRule: RuleType;
13    type Parser: PestParser<Self::Rule>;
14
15    #[doc(hidden)]
16    fn rule_alias(rule: Self::Rule) -> Self::AliasedRule;
17    #[doc(hidden)]
18    fn allows_shortcut(rule: Self::Rule) -> bool;
19
20    /// Parses a `&str` starting from `rule`
21    fn parse<'i>(
22        rule: Self::Rule,
23        input_str: &'i str,
24    ) -> Result<Nodes<'i, Self::Rule, ()>, Error<Self::Rule>> {
25        Self::parse_with_userdata(rule, input_str, ())
26    }
27
28    /// Parses a `&str` starting from `rule`, carrying `user_data` through the parser methods.
29    fn parse_with_userdata<'i, D>(
30        rule: Self::Rule,
31        input_str: &'i str,
32        user_data: D,
33    ) -> Result<Nodes<'i, Self::Rule, D>, Error<Self::Rule>> {
34        let pairs = Self::Parser::parse(rule, input_str)?;
35        Ok(Nodes::new(input_str, pairs, user_data))
36    }
37}