value: deserialize NodeStart with NodeSeed

This commit is contained in:
Matt Bilker
2018-09-03 00:16:45 -04:00
parent 8f5ba2edc7
commit ff14d25951
2 changed files with 46 additions and 29 deletions

View File

@@ -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<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
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<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
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<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where D: de::Deserializer<'de>
{
trace!("NodeValue::deserialize()");
deserializer.deserialize_tuple_struct("__value", 0, NodeVisitor { key: Some(self.0) })
}
}
pub struct NodeDeserializer<E> {
node: Node,
marker: PhantomData<E>,
@@ -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<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
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<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
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.

View File

@@ -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!(),
}