1use crate::{Error, Nodes};
2use pest::Parser as PestParser;
3use pest::RuleType;
4
5pub 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 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 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}