1
1
use crate :: { DynamicEntity , DynamicScene } ;
2
2
use anyhow:: Result ;
3
- use bevy_reflect:: {
4
- serde :: { ReflectSerializer , UntypedReflectDeserializer } ,
5
- Reflect , TypeRegistry , TypeRegistryArc ,
6
- } ;
3
+ use bevy_reflect:: serde :: { TypedReflectDeserializer , TypedReflectSerializer } ;
4
+ use bevy_reflect :: { serde :: UntypedReflectDeserializer , Reflect , TypeRegistry , TypeRegistryArc } ;
5
+ use bevy_utils :: HashSet ;
6
+ use serde :: ser :: SerializeMap ;
7
7
use serde:: {
8
8
de:: { DeserializeSeed , Error , MapAccess , SeqAccess , Visitor } ,
9
9
ser:: { SerializeSeq , SerializeStruct } ,
@@ -70,12 +70,12 @@ impl<'a> Serialize for ComponentsSerializer<'a> {
70
70
where
71
71
S : serde:: Serializer ,
72
72
{
73
- let mut state = serializer. serialize_seq ( Some ( self . components . len ( ) ) ) ?;
73
+ let mut state = serializer. serialize_map ( Some ( self . components . len ( ) ) ) ?;
74
74
for component in self . components {
75
- state. serialize_element ( & ReflectSerializer :: new (
76
- & * * component,
77
- & * self . registry . read ( ) ,
78
- ) ) ?;
75
+ state. serialize_entry (
76
+ component. type_name ( ) ,
77
+ & TypedReflectSerializer :: new ( & * * component , & * self . registry . read ( ) ) ,
78
+ ) ?;
79
79
}
80
80
state. end ( )
81
81
}
@@ -188,7 +188,7 @@ impl<'a, 'de> Visitor<'de> for SceneEntityVisitor<'a> {
188
188
return Err ( Error :: duplicate_field ( ENTITY_FIELD_COMPONENTS ) ) ;
189
189
}
190
190
191
- components = Some ( map. next_value_seed ( ComponentVecDeserializer {
191
+ components = Some ( map. next_value_seed ( ComponentDeserializer {
192
192
registry : self . registry ,
193
193
} ) ?) ;
194
194
}
@@ -209,32 +209,55 @@ impl<'a, 'de> Visitor<'de> for SceneEntityVisitor<'a> {
209
209
}
210
210
}
211
211
212
- pub struct ComponentVecDeserializer < ' a > {
212
+ pub struct ComponentDeserializer < ' a > {
213
213
pub registry : & ' a TypeRegistry ,
214
214
}
215
215
216
- impl < ' a , ' de > DeserializeSeed < ' de > for ComponentVecDeserializer < ' a > {
216
+ impl < ' a , ' de > DeserializeSeed < ' de > for ComponentDeserializer < ' a > {
217
217
type Value = Vec < Box < dyn Reflect > > ;
218
218
219
219
fn deserialize < D > ( self , deserializer : D ) -> Result < Self :: Value , D :: Error >
220
220
where
221
221
D : serde:: Deserializer < ' de > ,
222
222
{
223
- deserializer. deserialize_seq ( ComponentSeqVisitor {
223
+ deserializer. deserialize_map ( ComponentVisitor {
224
224
registry : self . registry ,
225
225
} )
226
226
}
227
227
}
228
228
229
- struct ComponentSeqVisitor < ' a > {
229
+ struct ComponentVisitor < ' a > {
230
230
pub registry : & ' a TypeRegistry ,
231
231
}
232
232
233
- impl < ' a , ' de > Visitor < ' de > for ComponentSeqVisitor < ' a > {
233
+ impl < ' a , ' de > Visitor < ' de > for ComponentVisitor < ' a > {
234
234
type Value = Vec < Box < dyn Reflect > > ;
235
235
236
236
fn expecting ( & self , formatter : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
237
- formatter. write_str ( "list of components" )
237
+ formatter. write_str ( "map of components" )
238
+ }
239
+
240
+ fn visit_map < A > ( self , mut map : A ) -> std:: result:: Result < Self :: Value , A :: Error >
241
+ where
242
+ A : MapAccess < ' de > ,
243
+ {
244
+ let mut added = HashSet :: new ( ) ;
245
+ let mut components = Vec :: new ( ) ;
246
+ while let Some ( key) = map. next_key :: < & str > ( ) ? {
247
+ if !added. insert ( key) {
248
+ return Err ( Error :: custom ( format ! ( "duplicate component: `{}`" , key) ) ) ;
249
+ }
250
+
251
+ let registration = self
252
+ . registry
253
+ . get_with_name ( key)
254
+ . ok_or_else ( || Error :: custom ( format ! ( "no registration found for `{}`" , key) ) ) ?;
255
+ components. push (
256
+ map. next_value_seed ( TypedReflectDeserializer :: new ( registration, self . registry ) ) ?,
257
+ ) ;
258
+ }
259
+
260
+ Ok ( components)
238
261
}
239
262
240
263
fn visit_seq < A > ( self , mut seq : A ) -> Result < Self :: Value , A :: Error >
0 commit comments