aboutsummaryrefslogtreecommitdiffstats
path: root/src/parser/serialize.rs
blob: 260084f91cd2b5194a731f326816cdadfcbb44fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
use pest::{RuleType, iterators::{Pair, Pairs}};
use serde::{
    Serialize,
    Serializer,
    ser::{
        SerializeSeq,
        SerializeStruct,
    },
};

pub struct PairsWrap<'i, R>(pub Pairs<'i, R>);
pub struct PairWrap <'i, R>(pub Pair <'i, R>);

impl<'i, R> Serialize for PairsWrap<'i, R> where R: RuleType {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer {
        let mut seq = serializer.serialize_seq(None)?;
        for pair in self.0.clone() {
            seq.serialize_element(&PairWrap(pair))?;
        }
        seq.end()
    }
}

impl<'i, R> Serialize for PairWrap<'i, R> where R: RuleType {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer {
        let mut state = serializer.serialize_struct("Pair", 3)?;
        state.serialize_field("rule", &format!("{:?}", self.0.as_rule()))?;
        let tokens: Vec<_> = self.0.clone().tokens().collect();
        if tokens.len() > 2 {
            state.serialize_field("inner", &PairsWrap(self.0.clone().into_inner()))?;
        } else {
            state.serialize_field("content", self.0.as_str())?;
        }
        state.end()
    }
}