Skip to main content

sdec_bevy/
apply.rs

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}