use bevy::ecs::system::SystemParam;
use bevy::prelude::{Res, ResMut};
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;
#[derive(Debug, SystemParam)]
pub struct IneffableCommands<'w> {
meta_data: Res<'w, IneffableMetaData>,
processed_actions: ResMut<'w, Ineffable>,
settings: ResMut<'w, IneffableSettings>,
}
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);
}
}