aboutsummaryrefslogtreecommitdiffstats
path: root/src/parser
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser')
-rw-r--r--src/parser/mod.rs3
-rw-r--r--src/parser/serialize.rs36
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()
+ }
+}