diff options
| author | Philipp A | 2018-10-31 12:21:08 +0100 |
|---|---|---|
| committer | Philipp A | 2018-10-31 12:21:08 +0100 |
| commit | 9bb60b5bf76f74c15df5f298800f9e3b7b62ffc5 (patch) | |
| tree | a9856dba51161b2b38219a8df81d3ea6d493a511 /src/parser | |
| parent | 07ada348558204e1736e29056eba6d73b2084cc2 (diff) | |
| download | rust-rst-9bb60b5bf76f74c15df5f298800f9e3b7b62ffc5.tar.bz2 | |
Added JSON serialization
Diffstat (limited to 'src/parser')
| -rw-r--r-- | src/parser/mod.rs | 3 | ||||
| -rw-r--r-- | src/parser/serialize.rs | 36 |
2 files changed, 38 insertions, 1 deletions
diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 2ae47cb..26470e8 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -1,10 +1,11 @@ pub mod token; +pub mod serialize; #[allow(unused_imports)] use pest::consumes_to; #[allow(unused_imports)] use pest::parses_to; -use pest_derive::*; +use pest_derive::Parser; #[derive(Parser)] #[grammar = "rst.pest"] diff --git a/src/parser/serialize.rs b/src/parser/serialize.rs new file mode 100644 index 0000000..260084f --- /dev/null +++ b/src/parser/serialize.rs @@ -0,0 +1,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() + } +} |
