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}