1
use crate::Error;
2
use crate::Nodes;
3
use pest::Parser as PestParser;
4
use pest::RuleType;
5

            
6
/// A trait that provides methods to parse strings.
7
/// Do not implement manually; instead use the [`parser`] macro provided by this crate.
8
///
9
/// [`parser`]: macro@crate::parser
10
pub trait Parser {
11
    type Rule: RuleType;
12
    #[doc(hidden)]
13
    type AliasedRule: RuleType;
14
    type Parser: PestParser<Self::Rule>;
15

            
16
    #[doc(hidden)]
17
    fn rule_alias(rule: Self::Rule) -> Self::AliasedRule;
18
    #[doc(hidden)]
19
    fn allows_shortcut(rule: Self::Rule) -> bool;
20

            
21
    /// Parses a `&str` starting from `rule`
22
    #[allow(clippy::result_large_err)]
23
802
    fn parse(rule: Self::Rule, input_str: &str) -> Result<Nodes<'_, Self::Rule, ()>, Error<Self::Rule>> {
24
802
        Self::parse_with_userdata(rule, input_str, ())
25
802
    }
26

            
27
    /// Parses a `&str` starting from `rule`, carrying `user_data` through the parser methods.
28
    #[allow(clippy::result_large_err)]
29
802
    fn parse_with_userdata<D>(
30
802
        rule: Self::Rule,
31
802
        input_str: &str,
32
802
        user_data: D,
33
802
    ) -> Result<Nodes<'_, Self::Rule, D>, Error<Self::Rule>> {
34
802
        let pairs = Self::Parser::parse(rule, input_str)?;
35
802
        Ok(Nodes::new(input_str, pairs, user_data))
36
802
    }
37
}