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