Skip to content

Commit b5c1029

Browse files
committed
implement serialize through intermediate representation
1 parent 7fb9415 commit b5c1029

File tree

2 files changed

+25
-62
lines changed

2 files changed

+25
-62
lines changed

src/serde.rs

Lines changed: 25 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,48 @@
1-
use std::num::NonZeroUsize;
1+
use serde::ser::{Serialize, SerializeStruct};
22

3-
use serde::{Deserialize, Serialize};
3+
use crate::{NodeRef, Tree};
44

5-
use crate::{Node, NodeId, Tree};
6-
7-
impl<T: Serialize> Serialize for Tree<T> {
8-
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
9-
where
10-
S: serde::Serializer,
11-
{
12-
self.vec.serialize(serializer)
13-
}
5+
#[derive(Debug)]
6+
struct SerNode<'a, T> {
7+
value: &'a T,
8+
children: Vec<SerNode<'a, T>>,
149
}
1510

16-
impl<'de, T: Deserialize<'de>> Deserialize<'de> for Tree<T> {
17-
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
18-
where
19-
D: serde::Deserializer<'de>,
20-
{
21-
let vec = Vec::deserialize(deserializer)?;
22-
Ok(Tree { vec })
11+
impl<'a, T> From<NodeRef<'a, T>> for SerNode<'a, T> {
12+
fn from(node: NodeRef<'a, T>) -> Self {
13+
let value: &T = node.value();
14+
let children: Vec<SerNode<'a, T>> = node.children().map(SerNode::<'a, T>::from).collect();
15+
SerNode { value, children }
2316
}
2417
}
2518

26-
impl<T: Serialize> Serialize for Node<T> {
19+
impl<'a, T: Serialize> Serialize for SerNode<'a, T> {
2720
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
2821
where
2922
S: serde::Serializer,
3023
{
31-
(
32-
&self.parent,
33-
&self.prev_sibling,
34-
&self.next_sibling,
35-
&self.children,
36-
&self.value,
37-
)
38-
.serialize(serializer)
24+
(&self.value, &self.children).serialize(serializer)
3925
}
4026
}
4127

42-
impl<'de, T: Deserialize<'de>> Deserialize<'de> for Node<T> {
43-
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
44-
where
45-
D: serde::Deserializer<'de>,
46-
{
47-
let (parent, prev_sibling, next_sibling, children, value) =
48-
<(
49-
Option<NodeId>,
50-
Option<NodeId>,
51-
Option<NodeId>,
52-
Option<(NodeId, NodeId)>,
53-
T,
54-
)>::deserialize(deserializer)?;
55-
Ok(Node {
56-
parent,
57-
prev_sibling,
58-
next_sibling,
59-
children,
60-
value,
61-
})
62-
}
63-
}
64-
65-
impl Serialize for NodeId {
28+
impl<T: Serialize> Serialize for Tree<T> {
6629
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
6730
where
6831
S: serde::Serializer,
6932
{
70-
self.0.serialize(serializer)
33+
SerNode::from(self.root()).serialize(serializer)
7134
}
7235
}
7336

74-
impl<'de> Deserialize<'de> for NodeId {
75-
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
76-
where
77-
D: serde::Deserializer<'de>,
78-
{
79-
let index = <NonZeroUsize>::deserialize(deserializer)?;
80-
Ok(NodeId(index))
37+
#[cfg(test)]
38+
mod test {
39+
use super::*;
40+
use crate::tree;
41+
42+
#[test]
43+
fn test_ser_node_from() {
44+
let tree = tree!("a" => {"b", "c" => {"d", "e"}, "f"});
45+
let repr = serde_json::to_string(&SerNode::from(tree.root())).unwrap();
46+
println!("{repr}");
8147
}
8248
}

tests/serde.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,4 @@ fn test_serialize() {
88

99
let serialized = serde_json::to_string(&tree).unwrap();
1010
println!("{serialized}");
11-
let deserialized: Tree<&str> = serde_json::from_str(&serialized).unwrap();
12-
13-
assert_eq!(tree, deserialized);
1411
}

0 commit comments

Comments
 (0)