//! Implement `serde::Serialize` and `serde::Deserialize` traits for Tree //! //! # Warning //! Serialize and Deserialize implementations are recursive. They require an amount of stack memory //! proportional to the depth of the tree. use std::{fmt, marker::PhantomData}; use serde::{ de::{self, MapAccess, Visitor}, ser::{Serialize, SerializeStruct}, Deserialize, Deserializer, }; use crate::{NodeMut, NodeRef, Tree}; #[derive(Debug)] struct SerNode<'a, T> { value: &'a T, children: Vec>, } impl<'a, T> From> for SerNode<'a, T> { fn from(node: NodeRef<'a, T>) -> Self { let value = node.value(); let children = node.children().map(SerNode::from).collect(); Self { value, children } } } impl Serialize for SerNode<'_, T> { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer, { let mut state = serializer.serialize_struct("Node", 2)?; state.serialize_field("value", &self.value)?; state.serialize_field("children", &self.children)?; state.end() } } impl Serialize for Tree { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer, { SerNode::from(self.root()).serialize(serializer) } } #[derive(Debug)] struct DeserNode { value: T, children: Vec>, } impl DeserNode { fn into_tree_node(self, parent: &mut NodeMut) { let mut node = parent.append(self.value); for child in self.children { child.into_tree_node(&mut node); } } } impl From> for Tree { fn from(root: DeserNode) -> Self { let mut tree: Tree = Tree::new(root.value); let mut tree_root = tree.root_mut(); for child in root.children { child.into_tree_node(&mut tree_root); } tree } } struct DeserNodeVisitor { marker: PhantomData DeserNode>, } impl DeserNodeVisitor { fn new() -> Self { DeserNodeVisitor { marker: PhantomData, } } } impl<'de, T> Visitor<'de> for DeserNodeVisitor where T: Deserialize<'de>, { type Value = DeserNode; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("struct Node") } fn visit_map(self, mut map: M) -> Result where M: MapAccess<'de>, { let mut value = None; let mut children = None; while let Some(key) = map.next_key()? { match key { "value" => { if value.is_some() { return Err(de::Error::duplicate_field("value")); } value = Some(map.next_value()?); } "children" => { if children.is_some() { return Err(de::Error::duplicate_field("children")); } children = Some(map.next_value()?); } _ => { return Err(de::Error::unknown_field(key, &["value", "children"])); } } } let value = value.ok_or_else(|| de::Error::missing_field("value"))?; let children = children.ok_or_else(|| de::Error::missing_field("children"))?; Ok(DeserNode { value, children }) } } impl<'de, T> Deserialize<'de> for DeserNode where T: Deserialize<'de>, { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { deserializer.deserialize_struct("Node", &["value", "children"], DeserNodeVisitor::new()) } } impl<'de, T: Deserialize<'de>> Deserialize<'de> for Tree { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de>, { let deser = DeserNode::::deserialize(deserializer)?; Ok(deser.into()) } }