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 } ,
@@ -100,12 +100,12 @@ impl<'a> Serialize for ComponentsSerializer<'a> {
100
100
where
101
101
S : serde:: Serializer ,
102
102
{
103
- let mut state = serializer. serialize_seq ( Some ( self . components . len ( ) ) ) ?;
103
+ let mut state = serializer. serialize_map ( Some ( self . components . len ( ) ) ) ?;
104
104
for component in self . components {
105
- state. serialize_element ( & ReflectSerializer :: new (
106
- & * * component,
107
- & * self . registry . read ( ) ,
108
- ) ) ?;
105
+ state. serialize_entry (
106
+ component. type_name ( ) ,
107
+ & TypedReflectSerializer :: new ( & * * component , & * self . registry . read ( ) ) ,
108
+ ) ?;
109
109
}
110
110
state. end ( )
111
111
}
@@ -287,7 +287,7 @@ impl<'a, 'de> Visitor<'de> for SceneEntityVisitor<'a> {
287
287
return Err ( Error :: duplicate_field ( ENTITY_FIELD_COMPONENTS ) ) ;
288
288
}
289
289
290
- components = Some ( map. next_value_seed ( ComponentVecDeserializer {
290
+ components = Some ( map. next_value_seed ( ComponentDeserializer {
291
291
registry : self . registry ,
292
292
} ) ?) ;
293
293
}
@@ -308,32 +308,55 @@ impl<'a, 'de> Visitor<'de> for SceneEntityVisitor<'a> {
308
308
}
309
309
}
310
310
311
- pub struct ComponentVecDeserializer < ' a > {
311
+ pub struct ComponentDeserializer < ' a > {
312
312
pub registry : & ' a TypeRegistry ,
313
313
}
314
314
315
- impl < ' a , ' de > DeserializeSeed < ' de > for ComponentVecDeserializer < ' a > {
315
+ impl < ' a , ' de > DeserializeSeed < ' de > for ComponentDeserializer < ' a > {
316
316
type Value = Vec < Box < dyn Reflect > > ;
317
317
318
318
fn deserialize < D > ( self , deserializer : D ) -> Result < Self :: Value , D :: Error >
319
319
where
320
320
D : serde:: Deserializer < ' de > ,
321
321
{
322
- deserializer. deserialize_seq ( ComponentSeqVisitor {
322
+ deserializer. deserialize_map ( ComponentVisitor {
323
323
registry : self . registry ,
324
324
} )
325
325
}
326
326
}
327
327
328
- struct ComponentSeqVisitor < ' a > {
328
+ struct ComponentVisitor < ' a > {
329
329
pub registry : & ' a TypeRegistry ,
330
330
}
331
331
332
- impl < ' a , ' de > Visitor < ' de > for ComponentSeqVisitor < ' a > {
332
+ impl < ' a , ' de > Visitor < ' de > for ComponentVisitor < ' a > {
333
333
type Value = Vec < Box < dyn Reflect > > ;
334
334
335
335
fn expecting ( & self , formatter : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
336
- formatter. write_str ( "list of components" )
336
+ formatter. write_str ( "map of components" )
337
+ }
338
+
339
+ fn visit_map < A > ( self , mut map : A ) -> std:: result:: Result < Self :: Value , A :: Error >
340
+ where
341
+ A : MapAccess < ' de > ,
342
+ {
343
+ let mut added = HashSet :: new ( ) ;
344
+ let mut components = Vec :: new ( ) ;
345
+ while let Some ( key) = map. next_key :: < & str > ( ) ? {
346
+ if !added. insert ( key) {
347
+ return Err ( Error :: custom ( format ! ( "duplicate component: `{}`" , key) ) ) ;
348
+ }
349
+
350
+ let registration = self
351
+ . registry
352
+ . get_with_name ( key)
353
+ . ok_or_else ( || Error :: custom ( format ! ( "no registration found for `{}`" , key) ) ) ?;
354
+ components. push (
355
+ map. next_value_seed ( TypedReflectDeserializer :: new ( registration, self . registry ) ) ?,
356
+ ) ;
357
+ }
358
+
359
+ Ok ( components)
337
360
}
338
361
339
362
fn visit_seq < A > ( self , mut seq : A ) -> Result < Self :: Value , A :: Error >
0 commit comments