Skip to content

Commit cff0b37

Browse files
committed
Reorganize Visitor impls
1 parent 6a75230 commit cff0b37

File tree

1 file changed

+69
-67
lines changed
  • crates/bevy_reflect/src/serde

1 file changed

+69
-67
lines changed

crates/bevy_reflect/src/serde/de.rs

Lines changed: 69 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -333,35 +333,55 @@ impl<'a, 'de> Visitor<'de> for TupleStructVisitor<'a> {
333333
}
334334
}
335335

336-
struct ListVisitor<'a> {
337-
list_info: &'a ListInfo,
336+
struct TupleVisitor<'a> {
337+
tuple_info: &'a TupleInfo,
338338
registry: &'a TypeRegistry,
339339
}
340340

341-
impl<'a, 'de> Visitor<'de> for ListVisitor<'a> {
342-
type Value = DynamicList;
341+
impl<'a, 'de> Visitor<'de> for TupleVisitor<'a> {
342+
type Value = DynamicTuple;
343343

344344
fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result {
345-
formatter.write_str("reflected list value")
345+
formatter.write_str("reflected tuple value")
346346
}
347347

348348
fn visit_seq<V>(self, mut seq: V) -> Result<Self::Value, V::Error>
349349
where
350350
V: SeqAccess<'de>,
351351
{
352-
let mut list = DynamicList::default();
353-
let type_info = get_type_info(
354-
self.list_info.item_type_id(),
355-
self.list_info.item_type_name(),
356-
self.registry,
357-
)?;
352+
let mut tuple = DynamicTuple::default();
353+
let mut index = 0usize;
354+
355+
let get_field_info = |index: usize| -> Result<&'a TypeInfo, V::Error> {
356+
let field = self.tuple_info.field_at(index).ok_or_else(|| {
357+
de::Error::custom(format_args!(
358+
"no field at index {} on tuple {}",
359+
index,
360+
self.tuple_info.type_name(),
361+
))
362+
})?;
363+
get_type_info(field.type_id(), field.type_name(), self.registry)
364+
};
365+
358366
while let Some(value) = seq.next_element_seed(TypedReflectDeserializer {
359-
type_info,
367+
type_info: get_field_info(index)?,
360368
registry: self.registry,
361369
})? {
362-
list.push_box(value);
370+
tuple.insert_boxed(value);
371+
index += 1;
372+
if index >= self.tuple_info.field_len() {
373+
break;
374+
}
363375
}
364-
Ok(list)
376+
377+
if tuple.field_len() != self.tuple_info.field_len() {
378+
return Err(Error::invalid_length(
379+
tuple.field_len(),
380+
&self.tuple_info.field_len().to_string().as_str(),
381+
));
382+
}
383+
384+
Ok(tuple)
365385
}
366386
}
367387

@@ -405,6 +425,38 @@ impl<'a, 'de> Visitor<'de> for ArrayVisitor<'a> {
405425
}
406426
}
407427

428+
struct ListVisitor<'a> {
429+
list_info: &'a ListInfo,
430+
registry: &'a TypeRegistry,
431+
}
432+
433+
impl<'a, 'de> Visitor<'de> for ListVisitor<'a> {
434+
type Value = DynamicList;
435+
436+
fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result {
437+
formatter.write_str("reflected list value")
438+
}
439+
440+
fn visit_seq<V>(self, mut seq: V) -> Result<Self::Value, V::Error>
441+
where
442+
V: SeqAccess<'de>,
443+
{
444+
let mut list = DynamicList::default();
445+
let type_info = get_type_info(
446+
self.list_info.item_type_id(),
447+
self.list_info.item_type_name(),
448+
self.registry,
449+
)?;
450+
while let Some(value) = seq.next_element_seed(TypedReflectDeserializer {
451+
type_info,
452+
registry: self.registry,
453+
})? {
454+
list.push_box(value);
455+
}
456+
Ok(list)
457+
}
458+
}
459+
408460
struct MapVisitor<'a> {
409461
map_info: &'a MapInfo,
410462
registry: &'a TypeRegistry,
@@ -447,58 +499,6 @@ impl<'a, 'de> Visitor<'de> for MapVisitor<'a> {
447499
}
448500
}
449501

450-
struct TupleVisitor<'a> {
451-
tuple_info: &'a TupleInfo,
452-
registry: &'a TypeRegistry,
453-
}
454-
455-
impl<'a, 'de> Visitor<'de> for TupleVisitor<'a> {
456-
type Value = DynamicTuple;
457-
458-
fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result {
459-
formatter.write_str("reflected tuple value")
460-
}
461-
462-
fn visit_seq<V>(self, mut seq: V) -> Result<Self::Value, V::Error>
463-
where
464-
V: SeqAccess<'de>,
465-
{
466-
let mut tuple = DynamicTuple::default();
467-
let mut index = 0usize;
468-
469-
let get_field_info = |index: usize| -> Result<&'a TypeInfo, V::Error> {
470-
let field = self.tuple_info.field_at(index).ok_or_else(|| {
471-
de::Error::custom(format_args!(
472-
"no field at index {} on tuple {}",
473-
index,
474-
self.tuple_info.type_name(),
475-
))
476-
})?;
477-
get_type_info(field.type_id(), field.type_name(), self.registry)
478-
};
479-
480-
while let Some(value) = seq.next_element_seed(TypedReflectDeserializer {
481-
type_info: get_field_info(index)?,
482-
registry: self.registry,
483-
})? {
484-
tuple.insert_boxed(value);
485-
index += 1;
486-
if index >= self.tuple_info.field_len() {
487-
break;
488-
}
489-
}
490-
491-
if tuple.field_len() != self.tuple_info.field_len() {
492-
return Err(Error::invalid_length(
493-
tuple.field_len(),
494-
&self.tuple_info.field_len().to_string().as_str(),
495-
));
496-
}
497-
498-
Ok(tuple)
499-
}
500-
}
501-
502502
fn get_type_info<'a, E: de::Error>(
503503
type_id: TypeId,
504504
type_name: &'a str,
@@ -657,7 +657,9 @@ mod tests {
657657
let dynamic_output = reflect_deserializer
658658
.deserialize(&mut ron_deserializer)
659659
.unwrap();
660-
let output = dynamic_output.take::<f32>().expect("underlying type should be f32");
660+
let output = dynamic_output
661+
.take::<f32>()
662+
.expect("underlying type should be f32");
661663
assert_eq!(1.23, output);
662664
}
663665

0 commit comments

Comments
 (0)