Skip to content

Commit 9f3d03d

Browse files
committed
implement deserialize through intermediate representation
1 parent b5c1029 commit 9f3d03d

File tree

2 files changed

+57
-16
lines changed

2 files changed

+57
-16
lines changed

src/serde.rs

Lines changed: 50 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
use serde::ser::{Serialize, SerializeStruct};
1+
use serde::{ser::Serialize, Deserialize};
22

3-
use crate::{NodeRef, Tree};
3+
use crate::{NodeId, NodeRef, Tree};
44

55
#[derive(Debug)]
66
struct SerNode<'a, T> {
@@ -34,15 +34,54 @@ impl<T: Serialize> Serialize for Tree<T> {
3434
}
3535
}
3636

37-
#[cfg(test)]
38-
mod test {
39-
use super::*;
40-
use crate::tree;
37+
#[derive(Debug)]
38+
struct DeserNode<T> {
39+
value: T,
40+
children: Vec<DeserNode<T>>,
41+
}
42+
43+
impl<T> DeserNode<T> {
44+
fn to_tree_node(self, tree: &mut Tree<T>, parent: NodeId) -> NodeId {
45+
let mut parent = tree.get_mut(parent).unwrap();
46+
let node = parent.append(self.value).id();
47+
48+
for child in self.children {
49+
child.to_tree_node(tree, node);
50+
}
51+
52+
node
53+
}
54+
}
55+
56+
impl<T> From<DeserNode<T>> for Tree<T> {
57+
fn from(root: DeserNode<T>) -> Self {
58+
let mut tree: Tree<T> = Tree::new(root.value);
59+
let root_id = tree.root().id;
4160

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}");
61+
for child in root.children {
62+
child.to_tree_node(&mut tree, root_id);
63+
}
64+
65+
tree
66+
}
67+
}
68+
69+
impl<'de, T: Deserialize<'de>> Deserialize<'de> for DeserNode<T> {
70+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
71+
where
72+
D: serde::Deserializer<'de>,
73+
{
74+
let (value, children) = <(T, Vec<DeserNode<T>>)>::deserialize(deserializer)?;
75+
Ok(DeserNode { value, children })
76+
}
77+
}
78+
79+
impl<'de, T: Deserialize<'de>> Deserialize<'de> for Tree<T> {
80+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
81+
where
82+
D: serde::Deserializer<'de>,
83+
{
84+
let deser = DeserNode::<T>::deserialize(deserializer)?;
85+
Ok(deser.into())
4786
}
4887
}

tests/serde.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
use ego_tree::{tree, Tree};
44

55
#[test]
6-
fn test_serialize() {
7-
let tree = tree!("r" => {"a", "b" => { "d", "e" }, "c"});
8-
9-
let serialized = serde_json::to_string(&tree).unwrap();
10-
println!("{serialized}");
6+
fn test_serde_round_trip() {
7+
let tree = tree!("a" => {"b", "c" => {"d", "e"}, "f"});
8+
let repr = serde_json::to_string(&tree).unwrap();
9+
println!("{repr}");
10+
let re_tree: Tree<&str> = serde_json::from_str(&repr).unwrap();
11+
println!("{re_tree}");
12+
assert_eq!(tree, re_tree);
1113
}

0 commit comments

Comments
 (0)