1use anyhow::{anyhow, Result};
2use bevy_ecs::prelude::World;
3use codec::{DeltaUpdateEntity, EntityId, EntitySnapshot};
4
5use crate::mapping::EntityMap;
6use crate::schema::BevySchema;
7
8pub fn apply_changes(
9 schema: &BevySchema,
10 world: &mut World,
11 entities: &mut EntityMap,
12 creates: &[EntitySnapshot],
13 destroys: &[EntityId],
14 updates: &[DeltaUpdateEntity],
15) -> Result<()> {
16 for destroy in destroys {
17 if let Some(entity) = entities.entity(*destroy) {
18 world.despawn(entity);
19 entities.unregister(*destroy);
20 }
21 }
22
23 for create in creates {
24 let entity = world.spawn_empty().id();
25 entities.register(create.id, entity);
26 for component in &create.components {
27 let adapter = schema
28 .adapter_by_component(component.id)
29 .ok_or_else(|| anyhow!("unknown component {:?}", component.id))?;
30 adapter.insert_component(world, entity, &component.fields)?;
31 }
32 }
33
34 apply_delta_updates(schema, world, entities, updates)?;
35 Ok(())
36}
37
38pub fn apply_delta_updates(
39 schema: &BevySchema,
40 world: &mut World,
41 entities: &mut EntityMap,
42 updates: &[DeltaUpdateEntity],
43) -> Result<()> {
44 for update in updates {
45 let Some(entity) = entities.entity(update.id) else {
46 continue;
47 };
48 for component in &update.components {
49 let adapter = schema
50 .adapter_by_component(component.id)
51 .ok_or_else(|| anyhow!("unknown component {:?}", component.id))?;
52 adapter.apply_update(world, entity, &component.fields)?;
53 }
54 }
55 Ok(())
56}