rantz_proto 1.2.4

An opinionated rust library for transforming on-disk assets into Entities in Bevy.
Documentation
use crate::prelude::*;
use bevy::{ecs::system::SystemId, prelude::*, utils::HashMap};
use std::any::TypeId;

#[derive(Debug, Clone, Component, PartialEq, Eq)]
pub struct FromPrototype<P: Prototype>(pub Id<P>);

#[derive(Resource)]
pub(crate) struct RebuildSystems(pub HashMap<TypeId, SystemId>);

impl RebuildSystems {
    fn new() -> Self {
        Default::default()
    }
}

impl Default for RebuildSystems {
    fn default() -> Self {
        Self(HashMap::new())
    }
}

fn rebuild<P: Prototype>(
    mut commands: Commands,
    query: Query<(Entity, &FromPrototype<P>)>,
    protos: ResMut<PrototypeLibrary<P>>,
) {
    for (e, proto) in query.iter() {
        if let Some(proto) = protos.get(&proto.0) {
            let mut target = commands.entity(e);
            target.add(move |mut e: EntityWorldMut| proto.rebuild(&mut e));
        }
    }
}

pub fn register_rebuild_system<P: Prototype>(world: &mut World) {
    let type_id = TypeId::of::<P>();
    let system_id = world.register_system(rebuild::<P>);

    check_insert_rebuild_system(world);
    let mut res = world.resource_mut::<RebuildSystems>();

    res.0.insert(type_id, system_id);
}

fn check_insert_rebuild_system(world: &mut World) {
    if world.get_resource::<RebuildSystems>().is_none() {
        let res = RebuildSystems::new();
        world.insert_resource(res);
    }
}