diff --git a/src/node/de.rs b/src/node/de.rs index 8bc81ee..91c37db 100644 --- a/src/node/de.rs +++ b/src/node/de.rs @@ -130,6 +130,50 @@ impl<'de> Deserialize<'de> for Node { } } +/// A `DeserializeSeed` holder to deserialize a `Node` from `NodeDeserializer` +pub(crate) struct NodeSeed; + +impl<'de> DeserializeSeed<'de> for NodeSeed { + type Value = Node; + + #[inline] + fn deserialize(self, deserializer: D) -> Result + where D: de::Deserializer<'de> + { + // `key` will be fixed in `deserialize_seq` + deserializer.deserialize_seq(NodeVisitor { key: None }) + } +} + +struct NodeValueSeed(String); + +impl<'de> DeserializeSeed<'de> for NodeValueSeed { + type Value = Node; + + #[inline] + fn deserialize(self, deserializer: D) -> Result + where D: de::Deserializer<'de> + { + deserializer.deserialize_map(NodeVisitor { key: Some(self.0) }) + } +} + +#[derive(Debug)] +pub(crate) struct NodeWithValueSeed(String); + +impl<'de> DeserializeSeed<'de> for NodeWithValueSeed { + type Value = Node; + + #[inline] + fn deserialize(self, deserializer: D) -> Result + where D: de::Deserializer<'de> + { + trace!("NodeValue::deserialize()"); + + deserializer.deserialize_tuple_struct("__value", 0, NodeVisitor { key: Some(self.0) }) + } +} + pub struct NodeDeserializer { node: Node, marker: PhantomData, @@ -204,34 +248,6 @@ impl<'de, E: Error> IntoDeserializer<'de, E> for Node { } } -/// A `DeserializeSeed` holder to deserialize a `Node` from `NodeDeserializer` -pub(crate) struct NodeSeed; - -impl<'de> DeserializeSeed<'de> for NodeSeed { - type Value = Node; - - #[inline] - fn deserialize(self, deserializer: D) -> Result - where D: de::Deserializer<'de> - { - // `key` will be fixed in `deserialize_seq` - deserializer.deserialize_seq(NodeVisitor { key: None }) - } -} - -struct NodeValueSeed(String); - -impl<'de> DeserializeSeed<'de> for NodeValueSeed { - type Value = Node; - - #[inline] - fn deserialize(self, deserializer: D) -> Result - where D: de::Deserializer<'de> - { - deserializer.deserialize_map(NodeVisitor { key: Some(self.0) }) - } -} - /// Node classifier that gets the key name and the type of the node before the /// main `Node` object handles getting the value based on the type and the /// attributes. diff --git a/src/value/mod.rs b/src/value/mod.rs index 0730ae3..94b273f 100644 --- a/src/value/mod.rs +++ b/src/value/mod.rs @@ -5,6 +5,7 @@ use serde::de::{Deserialize, Deserializer, DeserializeSeed}; use serde_bytes::ByteBuf; use node::Node; +use node::de::NodeSeed; use node_types::StandardType; mod de; @@ -80,7 +81,7 @@ macro_rules! construct_types { StandardType::Binary => ByteBuf::deserialize(deserializer).map(Vec::from).map(Value::Binary), StandardType::Time => u32::deserialize(deserializer).map(Value::Time), StandardType::Attribute => String::deserialize(deserializer).map(Value::Attribute), - StandardType::NodeStart => Node::deserialize(deserializer).map(Box::new).map(Value::Node), + StandardType::NodeStart => NodeSeed.deserialize(deserializer).map(Box::new).map(Value::Node), StandardType::NodeEnd | StandardType::FileEnd => unimplemented!(), }