use bevy::asset::{AssetServer, Assets, Handle, LoadState};
use bevy::prelude::{Commands, Reflect, Res, Resource};
use serde::{Deserialize, Serialize};
use crate::commands::IneffableCommands;
use crate::config::InputConfig;
#[derive(Debug, Resource)]
pub struct CurrentlyLoading {
pub handles: Vec<(MergeMode, Handle<InputConfig>)>,
}
pub(crate) fn manage_loading(
mut commands: Commands<'_, '_>,
mut ineffable: IneffableCommands<'_, '_>,
handles: Res<'_, CurrentlyLoading>,
assets: Res<'_, Assets<InputConfig>>,
asset_server: Res<'_, AssetServer>,
) {
let all_done = handles.handles.iter().all(|(_, handle)| {
matches!(
asset_server.load_state(handle),
LoadState::Loaded | LoadState::Failed(_)
)
});
if !all_done {
return;
}
commands.remove_resource::<CurrentlyLoading>();
let merged_config = handles
.handles
.iter()
.filter_map(|(merge_mode, handle)| assets.get(handle).map(|asset| (merge_mode, asset)))
.fold(
InputConfig::default(),
|acc, (merge_mode, next)| match merge_mode {
MergeMode::Base => next.clone(),
MergeMode::Append => acc.merge_append(next),
MergeMode::Replace => acc.merge_replace(next),
},
);
ineffable.set_config(&merged_config);
}
#[derive(Debug, Default, Serialize, Deserialize, Reflect, Clone, PartialEq, Eq, Hash)]
pub enum MergeMode {
Base,
Append,
#[default]
Replace,
}