1
use std::fmt;
2

            
3
pub struct DisplayPair<'i, R: pest::RuleType>(pub pest::iterators::Pair<'i, R>);
4

            
5
impl<R: pest::RuleType> fmt::Display for DisplayPair<'_, R> {
6
170
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
7
170
        self.display(f, 0)
8
170
    }
9
}
10

            
11
impl<R: pest::RuleType> DisplayPair<'_, R> {
12
421647
    fn display(&self, f: &mut fmt::Formatter, depth: usize) -> fmt::Result {
13
421647
        let span = self.0.clone().as_span();
14
421647
        let rule = self.0.as_rule();
15
421647
        let inner = self.0.clone().into_inner();
16
421647
        let indent = "  ".repeat(depth);
17
421647
        let children_possible = if let Some(len) = inner.size_hint().1 {
18
421647
            len > 0
19
        } else {
20
            true
21
        };
22

            
23
421647
        write!(
24
421647
            f,
25
421647
            "{}{:?}({}, {}, \"{}\"",
26
421647
            indent,
27
421647
            rule,
28
421647
            span.start_pos().pos(),
29
421647
            span.end_pos().pos(),
30
421647
            span.as_str()
31
421647
        )?;
32
421647
        if children_possible {
33
282601
            writeln!(f, ", [")?;
34
421477
            for pair in self.0.clone().into_inner() {
35
421477
                DisplayPair(pair).display(f, depth + 1)?;
36
            }
37
282601
            write!(f, "{}]),", indent)?;
38
        } else {
39
139046
            write!(f, ")")?;
40
        }
41

            
42
421647
        if depth > 0 {
43
421477
            writeln!(f)?;
44
170
        }
45

            
46
421647
        Ok(())
47
421647
    }
48
}