use bevy::asset::{AssetPath, AssetServer};
use bevy::ecs::system::SystemParam;
use bevy::prelude::{Commands, Res, ResMut};
use crate::config::simple_asset_loading::{CurrentlyLoading, MergeMode};
use crate::config::InputConfig;
use crate::prelude::Ineffable;
use crate::processed::bound_action::BoundAction;
use crate::processed::processor::{collect_inputs, validate};
use crate::reporting::InputConfigReport;
use crate::resources::ineffable_settings::IneffableSettings;
use crate::resources::meta_data::IneffableMetaData;
#[allow(missing_debug_implementations)]
#[derive(SystemParam)]
pub struct IneffableCommands<'w, 's> {
commands: Commands<'w, 's>,
meta_data: Res<'w, IneffableMetaData>,
processed_actions: ResMut<'w, Ineffable>,
settings: ResMut<'w, IneffableSettings>,
asset_server: Res<'w, AssetServer>,
}
impl IneffableCommands<'_, '_> {
#[must_use]
pub fn validate(&self, config: &InputConfig) -> InputConfigReport {
validate(&self.meta_data, config)
}
pub fn set_config(&mut self, config: &InputConfig) -> InputConfigReport {
let report = self.validate(config);
report.dump_to_log();
self.set_config_silent(config);
report
}
pub fn set_config_silent(&mut self, config: &InputConfig) {
let helper = collect_inputs(&self.meta_data, config);
self.processed_actions.groups = config
.bindings
.iter()
.filter(|(group_id, _)| self.meta_data.group_exists(group_id))
.map(|(group_id, group_data)| {
let mut bound_actions = Vec::new();
for meta in self.meta_data.actions(group_id) {
if let Some(action) = group_data.get(&meta.action_id) {
bound_actions.push(BoundAction::new(meta, action, &helper));
} else {
bound_actions.push(BoundAction::new(meta, &[], &helper));
}
}
(group_id.clone(), bound_actions)
})
.collect();
self.settings.set(config);
}
pub fn load_configs<'a>(&mut self, mut paths: Vec<(MergeMode, impl Into<AssetPath<'a>>)>) {
let handles = paths
.drain(..)
.map(|(merge_mode, path)| (merge_mode, self.asset_server.load(path)))
.collect();
self.commands.insert_resource(CurrentlyLoading { handles });
}
}