Structure: de: pass the new Structure to the Visitor

Use a `DeserializeSeed` to pass the newly created and named `Structure`.
This commit is contained in:
François Laignel 2018-07-21 15:09:22 +02:00 committed by Sebastian Dröge
parent 23307a4795
commit fd0c3f4464

View file

@ -10,7 +10,7 @@ use glib;
use glib::ToValue; use glib::ToValue;
use serde::de; use serde::de;
use serde::de::{Deserialize, Deserializer, SeqAccess, Visitor}; use serde::de::{Deserialize, DeserializeSeed, Deserializer, SeqAccess, Visitor};
use serde::ser; use serde::ser;
use serde::ser::{Serialize, Serializer, SerializeSeq, SerializeTuple}; use serde::ser::{Serialize, Serializer, SerializeSeq, SerializeTuple};
@ -105,39 +105,31 @@ impl<'de> Deserialize<'de> for FieldDe {
} }
} }
// FIXME: use DeserializeSeed instead struct FieldsDe<'a>(&'a mut StructureRef);
// Use `NamelessStructure` to deserialize the `Field`s and
// to add them to the `Structure` at the same time.
struct NamelessStructure(Structure);
impl From<NamelessStructure> for Structure {
fn from(nameless_structure: NamelessStructure) -> Self {
nameless_structure.0
}
}
struct NamelessStructureVisitor; struct FieldsVisitor<'a>(&'a mut StructureRef);
impl<'de> Visitor<'de> for NamelessStructureVisitor { impl<'de, 'a> Visitor<'de> for FieldsVisitor<'a> {
type Value = NamelessStructure; type Value = ();
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("a nameless `Structure` consisting of a sequence of `Field`s)") formatter.write_str("a sequence of `Structure` `Field`s")
} }
fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<Self::Value, A::Error> { fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<(), A::Error> {
// Can't build a `Structure` with an empty name
let mut structure = Structure::new_empty("None");
while let Some(field) = seq.next_element::<FieldDe>()? { while let Some(field) = seq.next_element::<FieldDe>()? {
let (name, value): (String, glib::SendValue) = field.into(); let (name, value): (String, glib::SendValue) = field.into();
structure.as_mut().set_value(name.as_str(), value); self.0.set_value(name.as_str(), value);
} }
Ok(NamelessStructure(structure)) Ok(())
} }
} }
impl<'de> Deserialize<'de> for NamelessStructure { impl<'de, 'a> DeserializeSeed<'de> for FieldsDe<'a> {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> { type Value = ();
deserializer.deserialize_seq(NamelessStructureVisitor)
fn deserialize<D: Deserializer<'de>>(self, deserializer: D) -> Result<(), D::Error> {
deserializer.deserialize_seq(FieldsVisitor(self.0))
} }
} }
@ -146,16 +138,15 @@ impl<'de> Visitor<'de> for StructureVisitor {
type Value = Structure; type Value = Structure;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("a `Structure`: (name: `String`, fields: sequence of `Field`s)") formatter.write_str("a `Structure` (name, sequence of `Field`s)")
} }
fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<Self::Value, A::Error> { fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<Self::Value, A::Error> {
let name = seq.next_element::<String>()? let name = seq.next_element::<String>()?
.ok_or(de::Error::custom("Expected a name for the `Structure`"))?; .ok_or(de::Error::custom("Expected a name for the `Structure`"))?;
let mut structure: Structure = seq.next_element::<NamelessStructure>()? let mut structure = Structure::new_empty(&name);
.ok_or(de::Error::custom("Expected a sequence of `Field`s"))? seq.next_element_seed(FieldsDe(structure.as_mut()))?
.into(); .ok_or(de::Error::custom("Expected a sequence of `Field`s"))?;
structure.set_name(name.as_str());
Ok(structure) Ok(structure)
} }