in serde-reflection/src/de.rs [347:390]
fn deserialize_struct<V>(
self,
name: &'static str,
fields: &'static [&'static str],
visitor: V,
) -> Result<V::Value>
where
V: Visitor<'de>,
{
self.format.unify(Format::TypeName(name.into()))?;
if self.tracer.config.record_samples_for_structs {
// If a value was recorded during serialization, use it.
if let Some((format, sample)) = self.tracer.get_sample(self.samples, name) {
let result = || visitor.visit_seq(sample.seq_values()?.into_seq_deserializer());
return result().map_err(|err| match err {
Error::DeserializationError(msg) => {
let mut format = format.clone();
format.reduce();
Error::UnexpectedDeserializationFormat(name, format, msg)
}
_ => err,
});
}
}
// Pre-update the registry.
let mut formats: Vec<_> = fields
.iter()
.map(|&name| Named {
name: name.into(),
value: Format::unknown(),
})
.collect();
self.tracer
.registry
.entry(name.to_string())
.unify(ContainerFormat::Struct(formats.clone()))?;
// Compute the formats.
let inner = SeqDeserializer::new(
self.tracer,
self.samples,
formats.iter_mut().map(|named| &mut named.value),
);
visitor.visit_seq(inner)
}