Skip to content

Commit 714bcc9

Browse files
committed
Remove duplicate field_names/variant_names fields
1 parent 9ebd312 commit 714bcc9

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
@@ -12,7 +12,8 @@ use serde::de::{
1212
use serde::Deserialize;
1313
use std::any::TypeId;
1414
use std::fmt;
15-
use std::fmt::Formatter;
15+
use std::fmt::{Debug, Display, Formatter};
16+
use std::slice::Iter;
1617

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

3031
trait TupleLikeInfo {
@@ -42,8 +43,8 @@ impl StructLikeInfo for StructInfo {
4243
self.field(name)
4344
}
4445

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

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

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

@@ -89,6 +90,39 @@ impl TupleLikeInfo for TupleVariantInfo {
8990
}
9091
}
9192

93+
/// A debug struct used for error messages that displays a list of expected values.
94+
///
95+
/// # Example
96+
///
97+
/// ```ignore
98+
/// let expected = vec!["foo", "bar", "baz"];
99+
/// assert_eq!("`foo`, `bar`, `baz`", format!("{}", ExpectedValues(expected)));
100+
/// ```
101+
struct ExpectedValues<TIntoIter, TIter, TItem>(TIntoIter)
102+
where
103+
TIntoIter: IntoIterator<IntoIter = TIter> + Clone,
104+
TIter: Iterator<Item = TItem> + ExactSizeIterator,
105+
TItem: Display;
106+
107+
impl<TIntoIter, TIter, TItem> Debug for ExpectedValues<TIntoIter, TIter, TItem>
108+
where
109+
TIntoIter: IntoIterator<IntoIter = TIter> + Clone,
110+
TIter: Iterator<Item = TItem> + ExactSizeIterator,
111+
TItem: Display,
112+
{
113+
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
114+
let iter = self.0.clone().into_iter();
115+
let len = iter.len();
116+
for (index, item) in iter.enumerate() {
117+
write!(f, "`{}`", item)?;
118+
if index < len - 1 {
119+
write!(f, ", ")?;
120+
}
121+
}
122+
Ok(())
123+
}
124+
}
125+
92126
/// Represents a simple reflected identifier.
93127
#[derive(Debug, Clone, Eq, PartialEq)]
94128
struct Ident(String);
@@ -254,7 +288,8 @@ impl<'a, 'de> DeserializeSeed<'de> for TypedReflectDeserializer<'a> {
254288
TypeInfo::Struct(struct_info) => {
255289
let mut dynamic_struct = deserializer.deserialize_struct(
256290
struct_info.name(),
257-
struct_info.field_names(),
291+
// Field names are mainly just a hint, we don't necessarily need to store and pass that data
292+
&[],
258293
StructVisitor {
259294
struct_info,
260295
registry: self.registry,
@@ -323,7 +358,8 @@ impl<'a, 'de> DeserializeSeed<'de> for TypedReflectDeserializer<'a> {
323358
} else {
324359
deserializer.deserialize_enum(
325360
enum_info.name(),
326-
enum_info.variant_names(),
361+
// Variant names are mainly just a hint, we don't necessarily need to store and pass that data
362+
&[],
327363
EnumVisitor {
328364
enum_info,
329365
registry: self.registry,
@@ -576,15 +612,20 @@ impl<'a, 'de> Visitor<'de> for EnumVisitor<'a> {
576612
{
577613
let mut dynamic_enum = DynamicEnum::default();
578614
let (Ident(variant_name), variant) = data.variant().unwrap();
579-
let variant_info = self
580-
.enum_info
581-
.variant(&variant_name)
582-
.ok_or_else(|| Error::unknown_variant(&variant_name, self.enum_info.variant_names()))?;
615+
let variant_info = self.enum_info.variant(&variant_name).ok_or_else(|| {
616+
let names = self.enum_info.iter().map(|variant| variant.name());
617+
Error::custom(format_args!(
618+
"unknown variant `{}`, expected one of {:?}",
619+
variant_name,
620+
ExpectedValues(names)
621+
))
622+
})?;
583623
let value: DynamicVariant = match variant_info {
584624
VariantInfo::Unit(..) => variant.unit_variant()?.into(),
585625
VariantInfo::Struct(struct_info) => variant
586626
.struct_variant(
587-
struct_info.field_names(),
627+
// Field names are mainly just a hint, we don't necessarily need to store and pass that data
628+
&[],
588629
StructVariantVisitor {
589630
struct_info,
590631
registry: self.registry,
@@ -720,9 +761,14 @@ where
720761
{
721762
let mut dynamic_struct = DynamicStruct::default();
722763
while let Some(Ident(key)) = map.next_key::<Ident>()? {
723-
let field = info
724-
.get_field(&key)
725-
.ok_or_else(|| Error::unknown_field(&key, info.get_field_names()))?;
764+
let field = info.get_field(&key).ok_or_else(|| {
765+
let fields = info.iter_fields().map(|field| field.name());
766+
Error::custom(format_args!(
767+
"unknown field `{}`, expected one of {:?}",
768+
key,
769+
ExpectedValues(fields)
770+
))
771+
})?;
726772
let registration = get_registration(field.type_id(), field.type_name(), registry)?;
727773
let value = map.next_value_seed(TypedReflectDeserializer {
728774
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)