mirror of
https://github.com/mbilker/kbinxml-rs.git
synced 2026-09-09 11:05:19 -05:00
value: deserialize NodeStart with NodeSeed
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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!(),
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user