mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-04-25 20:57:55 +00:00
feat: Add deserializers that use visitors.
This deserializers can be used to delegate deserialization to another
type's visitor.
Example:
```json
fn visit_map<V>(&mut self, visitor: V) -> Result<Self::Value, V::Error>
where V: de::MapVisitor
{
let mut deserializer = de::value::MapVisitorDeserializer::new(visitor);
try!(Deserialize::deserialize(&mut deserializer))
}
```
This commit is contained in:
@@ -362,6 +362,38 @@ impl<T, E> ValueDeserializer<E> for HashSet<T>
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// A helper deserializer that deserializes a sequence using a `SeqVisitor`.
|
||||
pub struct SeqVisitorDeserializer<V_, E> {
|
||||
visitor: V_,
|
||||
marker: PhantomData<E>,
|
||||
}
|
||||
|
||||
impl<V_, E> SeqVisitorDeserializer<V_, E>
|
||||
where V_: de::SeqVisitor<Error = E>,
|
||||
E: de::Error,
|
||||
{
|
||||
/// Construct a new `SeqVisitorDeserializer<V_, E>`.
|
||||
pub fn new(visitor: V_) -> Self {
|
||||
SeqVisitorDeserializer{
|
||||
visitor: visitor,
|
||||
marker: PhantomData
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<V_, E> de::Deserializer for SeqVisitorDeserializer<V_, E>
|
||||
where V_: de::SeqVisitor<Error = E>,
|
||||
E: de::Error,
|
||||
{
|
||||
type Error = E;
|
||||
|
||||
fn visit<V: de::Visitor>(&mut self, mut visitor: V) -> Result<V::Value, Self::Error> {
|
||||
visitor.visit_seq(&mut self.visitor)
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// A helper deserializer that deserializes a map.
|
||||
pub struct MapDeserializer<I, K, V, E>
|
||||
where I: Iterator<Item=(K, V)>,
|
||||
@@ -484,6 +516,38 @@ impl<K, V, E> ValueDeserializer<E> for HashMap<K, V>
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// A helper deserializer that deserializes a map using a `MapVisitor`.
|
||||
pub struct MapVisitorDeserializer<V_, E> {
|
||||
visitor: V_,
|
||||
marker: PhantomData<E>,
|
||||
}
|
||||
|
||||
impl<V_, E> MapVisitorDeserializer<V_, E>
|
||||
where V_: de::MapVisitor<Error = E>,
|
||||
E: de::Error,
|
||||
{
|
||||
/// Construct a new `MapVisitorDeserializer<V_, E>`.
|
||||
pub fn new(visitor: V_) -> Self {
|
||||
MapVisitorDeserializer{
|
||||
visitor: visitor,
|
||||
marker: PhantomData
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<V_, E> de::Deserializer for MapVisitorDeserializer<V_, E>
|
||||
where V_: de::MapVisitor<Error = E>,
|
||||
E: de::Error,
|
||||
{
|
||||
type Error = E;
|
||||
|
||||
fn visit<V: de::Visitor>(&mut self, mut visitor: V) -> Result<V::Value, Self::Error> {
|
||||
visitor.visit_map(&mut self.visitor)
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
impl<'a, E> ValueDeserializer<E> for bytes::Bytes<'a>
|
||||
where E: de::Error,
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user