sdec-bevy 0.8.0

Bevy adapter for sdec schema + delta encoding
Documentation
use anyhow::{anyhow, Result};
use bevy_ecs::prelude::World;
use codec::{DeltaUpdateEntity, EntityId, EntitySnapshot};

use crate::mapping::EntityMap;
use crate::schema::BevySchema;

pub fn apply_changes(
    schema: &BevySchema,
    world: &mut World,
    entities: &mut EntityMap,
    creates: &[EntitySnapshot],
    destroys: &[EntityId],
    updates: &[DeltaUpdateEntity],
) -> Result<()> {
    for destroy in destroys {
        if let Some(entity) = entities.entity(*destroy) {
            world.despawn(entity);
            entities.unregister(*destroy);
        }
    }

    for create in creates {
        let entity = world.spawn_empty().id();
        entities.register(create.id, entity);
        for component in &create.components {
            let adapter = schema
                .adapter_by_component(component.id)
                .ok_or_else(|| anyhow!("unknown component {:?}", component.id))?;
            adapter.insert_component(world, entity, &component.fields)?;
        }
    }

    apply_delta_updates(schema, world, entities, updates)?;
    Ok(())
}

pub fn apply_delta_updates(
    schema: &BevySchema,
    world: &mut World,
    entities: &mut EntityMap,
    updates: &[DeltaUpdateEntity],
) -> Result<()> {
    for update in updates {
        let Some(entity) = entities.entity(update.id) else {
            continue;
        };
        for component in &update.components {
            let adapter = schema
                .adapter_by_component(component.id)
                .ok_or_else(|| anyhow!("unknown component {:?}", component.id))?;
            adapter.apply_update(world, entity, &component.fields)?;
        }
    }
    Ok(())
}