Skip to content

Commit 4fe42a2

Browse files
committed
Remove duplicate field_names/variant_names fields
1 parent 85a38ea commit 4fe42a2

File tree

4 files changed

+62
-44
lines changed

4 files changed

+62
-44
lines changed

crates/bevy_reflect/src/enums/enum_trait.rs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,6 @@ pub struct EnumInfo {
136136
type_name: &'static str,
137137
type_id: TypeId,
138138
variants: Box<[VariantInfo]>,
139-
variant_names: Box<[&'static str]>,
140139
variant_indices: HashMap<&'static str, usize>,
141140
}
142141

@@ -155,17 +154,11 @@ impl EnumInfo {
155154
.map(|(index, variant)| (variant.name(), index))
156155
.collect::<HashMap<_, _>>();
157156

158-
let variant_names = variants
159-
.iter()
160-
.map(|variant| variant.name())
161-
.collect::<Vec<_>>();
162-
163157
Self {
164158
name,
165159
type_name: std::any::type_name::<TEnum>(),
166160
type_id: TypeId::of::<TEnum>(),
167161
variants: variants.to_vec().into_boxed_slice(),
168-
variant_names: variant_names.into_boxed_slice(),
169162
variant_indices,
170163
}
171164
}
@@ -177,11 +170,6 @@ impl EnumInfo {
177170
.map(|index| &self.variants[*index])
178171
}
179172

180-
/// A slice containing the names of all variants in order.
181-
pub fn variant_names(&self) -> &[&'static str] {
182-
&self.variant_names
183-
}
184-
185173
/// Get a variant at the given index.
186174
pub fn variant_at(&self, index: usize) -> Option<&VariantInfo> {
187175
self.variants.get(index)

crates/bevy_reflect/src/enums/variants.rs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -79,19 +79,16 @@ impl VariantInfo {
7979
pub struct StructVariantInfo {
8080
name: &'static str,
8181
fields: Box<[NamedField]>,
82-
field_names: Box<[&'static str]>,
8382
field_indices: HashMap<&'static str, usize>,
8483
}
8584

8685
impl StructVariantInfo {
8786
/// Create a new [`StructVariantInfo`].
8887
pub fn new(name: &'static str, fields: &[NamedField]) -> Self {
8988
let field_indices = Self::collect_field_indices(fields);
90-
let field_names = fields.iter().map(|field| field.name()).collect::<Vec<_>>();
9189
Self {
9290
name,
9391
fields: fields.to_vec().into_boxed_slice(),
94-
field_names: field_names.into_boxed_slice(),
9592
field_indices,
9693
}
9794
}
@@ -108,11 +105,6 @@ impl StructVariantInfo {
108105
.map(|index| &self.fields[*index])
109106
}
110107

111-
/// A slice containing the names of all fields in order.
112-
pub fn field_names(&self) -> &[&'static str] {
113-
&self.field_names
114-
}
115-
116108
/// Get the field at the given index.
117109
pub fn field_at(&self, index: usize) -> Option<&NamedField> {
118110
self.fields.get(index)

crates/bevy_reflect/src/serde/de.rs

Lines changed: 62 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ use serde::de::{
1313
use serde::Deserialize;
1414
use std::any::TypeId;
1515
use std::fmt;
16-
use std::fmt::Formatter;
16+
use std::fmt::{Debug, Display, Formatter};
17+
use std::slice::Iter;
1718

1819
pub trait DeserializeValue {
1920
fn deserialize(
@@ -25,7 +26,7 @@ pub trait DeserializeValue {
2526
trait StructLikeInfo {
2627
fn get_name(&self) -> &str;
2728
fn get_field(&self, name: &str) -> Option<&NamedField>;
28-
fn get_field_names(&self) -> &[&'static str];
29+
fn iter_fields(&self) -> Iter<'_, NamedField>;
2930
}
3031

3132
trait TupleLikeInfo {
@@ -43,8 +44,8 @@ impl StructLikeInfo for StructInfo {
4344
self.field(name)
4445
}
4546

46-
fn get_field_names(&self) -> &[&'static str] {
47-
self.field_names()
47+
fn iter_fields(&self) -> Iter<'_, NamedField> {
48+
self.iter()
4849
}
4950
}
5051

@@ -57,8 +58,8 @@ impl StructLikeInfo for StructVariantInfo {
5758
self.field(name)
5859
}
5960

60-
fn get_field_names(&self) -> &[&'static str] {
61-
self.field_names()
61+
fn iter_fields(&self) -> Iter<'_, NamedField> {
62+
self.iter()
6263
}
6364
}
6465

@@ -90,6 +91,39 @@ impl TupleLikeInfo for TupleVariantInfo {
9091
}
9192
}
9293

94+
/// A debug struct used for error messages that displays a list of expected values.
95+
///
96+
/// # Example
97+
///
98+
/// ```ignore
99+
/// let expected = vec!["foo", "bar", "baz"];
100+
/// assert_eq!("`foo`, `bar`, `baz`", format!("{}", ExpectedValues(expected)));
101+
/// ```
102+
struct ExpectedValues<TIntoIter, TIter, TItem>(TIntoIter)
103+
where
104+
TIntoIter: IntoIterator<IntoIter = TIter> + Clone,
105+
TIter: Iterator<Item = TItem> + ExactSizeIterator,
106+
TItem: Display;
107+
108+
impl<TIntoIter, TIter, TItem> Debug for ExpectedValues<TIntoIter, TIter, TItem>
109+
where
110+
TIntoIter: IntoIterator<IntoIter = TIter> + Clone,
111+
TIter: Iterator<Item = TItem> + ExactSizeIterator,
112+
TItem: Display,
113+
{
114+
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
115+
let iter = self.0.clone().into_iter();
116+
let len = iter.len();
117+
for (index, item) in iter.enumerate() {
118+
write!(f, "`{}`", item)?;
119+
if index < len - 1 {
120+
write!(f, ", ")?;
121+
}
122+
}
123+
Ok(())
124+
}
125+
}
126+
93127
/// Represents a simple reflected identifier.
94128
#[derive(Debug, Clone, Eq, PartialEq)]
95129
struct Ident(String);
@@ -255,7 +289,8 @@ impl<'a, 'de> DeserializeSeed<'de> for TypedReflectDeserializer<'a> {
255289
TypeInfo::Struct(struct_info) => {
256290
let mut dynamic_struct = deserializer.deserialize_struct(
257291
struct_info.name(),
258-
struct_info.field_names(),
292+
// Field names are mainly just a hint, we don't necessarily need to store and pass that data
293+
&[],
259294
StructVisitor {
260295
struct_info,
261296
registry: self.registry,
@@ -324,7 +359,8 @@ impl<'a, 'de> DeserializeSeed<'de> for TypedReflectDeserializer<'a> {
324359
} else {
325360
deserializer.deserialize_enum(
326361
enum_info.name(),
327-
enum_info.variant_names(),
362+
// Variant names are mainly just a hint, we don't necessarily need to store and pass that data
363+
&[],
328364
EnumVisitor {
329365
enum_info,
330366
registry: self.registry,
@@ -583,15 +619,20 @@ impl<'a, 'de> Visitor<'de> for EnumVisitor<'a> {
583619
{
584620
let mut dynamic_enum = DynamicEnum::default();
585621
let (Ident(variant_name), variant) = data.variant().unwrap();
586-
let variant_info = self
587-
.enum_info
588-
.variant(&variant_name)
589-
.ok_or_else(|| Error::unknown_variant(&variant_name, self.enum_info.variant_names()))?;
622+
let variant_info = self.enum_info.variant(&variant_name).ok_or_else(|| {
623+
let names = self.enum_info.iter().map(|variant| variant.name());
624+
Error::custom(format_args!(
625+
"unknown variant `{}`, expected one of {:?}",
626+
variant_name,
627+
ExpectedValues(names)
628+
))
629+
})?;
590630
let value: DynamicVariant = match variant_info {
591631
VariantInfo::Unit(..) => variant.unit_variant()?.into(),
592632
VariantInfo::Struct(struct_info) => variant
593633
.struct_variant(
594-
struct_info.field_names(),
634+
// Field names are mainly just a hint, we don't necessarily need to store and pass that data
635+
&[],
595636
StructVariantVisitor {
596637
struct_info,
597638
registry: self.registry,
@@ -727,9 +768,14 @@ where
727768
{
728769
let mut dynamic_struct = DynamicStruct::default();
729770
while let Some(Ident(key)) = map.next_key::<Ident>()? {
730-
let field = info
731-
.get_field(&key)
732-
.ok_or_else(|| Error::unknown_field(&key, info.get_field_names()))?;
771+
let field = info.get_field(&key).ok_or_else(|| {
772+
let fields = info.iter_fields().map(|field| field.name());
773+
Error::custom(format_args!(
774+
"unknown field `{}`, expected one of {:?}",
775+
key,
776+
ExpectedValues(fields)
777+
))
778+
})?;
733779
let registration = get_registration(field.type_id(), field.type_name(), registry)?;
734780
let value = map.next_value_seed(TypedReflectDeserializer {
735781
registration,

crates/bevy_reflect/src/struct_trait.rs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ pub struct StructInfo {
7373
type_name: &'static str,
7474
type_id: TypeId,
7575
fields: Box<[NamedField]>,
76-
field_names: Box<[&'static str]>,
7776
field_indices: HashMap<&'static str, usize>,
7877
}
7978

@@ -91,13 +90,11 @@ impl StructInfo {
9190
.enumerate()
9291
.map(|(index, field)| (field.name(), index))
9392
.collect::<HashMap<_, _>>();
94-
let field_names = fields.iter().map(|field| field.name()).collect::<Vec<_>>();
9593

9694
Self {
9795
name,
9896
type_name: std::any::type_name::<T>(),
9997
type_id: TypeId::of::<T>(),
100-
field_names: field_names.into_boxed_slice(),
10198
fields: fields.to_vec().into_boxed_slice(),
10299
field_indices,
103100
}
@@ -110,11 +107,6 @@ impl StructInfo {
110107
.map(|index| &self.fields[*index])
111108
}
112109

113-
/// A slice containing the names of all fields in order.
114-
pub fn field_names(&self) -> &[&'static str] {
115-
&self.field_names
116-
}
117-
118110
/// Get the field at the given index.
119111
pub fn field_at(&self, index: usize) -> Option<&NamedField> {
120112
self.fields.get(index)

0 commit comments

Comments
 (0)