rst_parser/
pair_ext_parse.rs

1use std::str::FromStr;
2
3use pest::Span;
4use pest::error::{Error, ErrorVariant};
5use pest::iterators::Pair;
6
7pub trait PairExt<R>
8where
9    R: pest::RuleType,
10{
11    fn parse<T, E>(&self) -> Result<T, Box<Error<R>>>
12    where
13        T: FromStr<Err = E>,
14        E: ToString;
15}
16
17impl<R> PairExt<R> for Pair<'_, R>
18where
19    R: pest::RuleType,
20{
21    fn parse<T, E>(&self) -> Result<T, Box<Error<R>>>
22    where
23        T: FromStr<Err = E>,
24        E: ToString,
25    {
26        self.as_str()
27            .parse()
28            .map_err(|e| to_parse_error(self.as_span(), &e))
29    }
30}
31
32pub(crate) fn to_parse_error<E, R>(span: Span, e: &E) -> Box<Error<R>>
33where
34    E: ToString,
35    R: pest::RuleType,
36{
37    let var: ErrorVariant<R> = ErrorVariant::CustomError {
38        message: e.to_string(),
39    };
40    Box::new(Error::new_from_span(var, span))
41}