|
1 | | -use serde::ser::{Serialize, SerializeStruct}; |
| 1 | +use serde::{ser::Serialize, Deserialize}; |
2 | 2 |
|
3 | | -use crate::{NodeRef, Tree}; |
| 3 | +use crate::{NodeId, NodeRef, Tree}; |
4 | 4 |
|
5 | 5 | #[derive(Debug)] |
6 | 6 | struct SerNode<'a, T> { |
@@ -34,15 +34,54 @@ impl<T: Serialize> Serialize for Tree<T> { |
34 | 34 | } |
35 | 35 | } |
36 | 36 |
|
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; |
41 | 60 |
|
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()) |
47 | 86 | } |
48 | 87 | } |
0 commit comments