Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_reflect/src/serde/de/tuple_structs.rs
6600 views
1
use crate::{
2
serde::{de::tuple_utils::visit_tuple, SerializationData},
3
DynamicTupleStruct, TupleStructInfo, TypeRegistration, TypeRegistry,
4
};
5
use core::{fmt, fmt::Formatter};
6
use serde::de::{DeserializeSeed, SeqAccess, Visitor};
7
8
use super::{registration_utils::try_get_registration, TypedReflectDeserializer};
9
10
use super::ReflectDeserializerProcessor;
11
12
/// A [`Visitor`] for deserializing [`TupleStruct`] values.
13
///
14
/// [`TupleStruct`]: crate::TupleStruct
15
pub(super) struct TupleStructVisitor<'a, P> {
16
pub tuple_struct_info: &'static TupleStructInfo,
17
pub registration: &'a TypeRegistration,
18
pub registry: &'a TypeRegistry,
19
pub processor: Option<&'a mut P>,
20
}
21
22
impl<'de, P: ReflectDeserializerProcessor> Visitor<'de> for TupleStructVisitor<'_, P> {
23
type Value = DynamicTupleStruct;
24
25
fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {
26
formatter.write_str("reflected tuple struct value")
27
}
28
29
fn visit_seq<V>(self, mut seq: V) -> Result<Self::Value, V::Error>
30
where
31
V: SeqAccess<'de>,
32
{
33
visit_tuple(
34
&mut seq,
35
self.tuple_struct_info,
36
self.registration,
37
self.registry,
38
self.processor,
39
)
40
.map(DynamicTupleStruct::from)
41
}
42
43
fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
44
where
45
D: serde::Deserializer<'de>,
46
{
47
let mut tuple = DynamicTupleStruct::default();
48
let serialization_data = self.registration.data::<SerializationData>();
49
50
if let Some(value) = serialization_data.and_then(|data| data.generate_default(0)) {
51
tuple.insert_boxed(value.into_partial_reflect());
52
return Ok(tuple);
53
}
54
55
let registration = try_get_registration(
56
*self
57
.tuple_struct_info
58
.field_at(0)
59
.ok_or(serde::de::Error::custom("Field at index 0 not found"))?
60
.ty(),
61
self.registry,
62
)?;
63
let reflect_deserializer =
64
TypedReflectDeserializer::new_internal(registration, self.registry, self.processor);
65
let value = reflect_deserializer.deserialize(deserializer)?;
66
67
tuple.insert_boxed(value.into_partial_reflect());
68
69
Ok(tuple)
70
}
71
}
72
73