use super::axis::Axis;
use super::button::Button;
use ahash::AHashMap;
use serde::{Deserialize, Serialize};
use std::hash::Hash;
#[derive(Default, Serialize, Deserialize)]
pub struct Bindings<ActionId, AxisId>
where
ActionId: Clone + Eq + Hash + Send + Sync,
AxisId: Clone + Eq + Hash + Send + Sync,
{
pub(super) actions: AHashMap<ActionId, Vec<Vec<Button>>>,
pub(super) axes: AHashMap<AxisId, Vec<Axis>>,
}
impl<'de, ActionId, AxisId> Bindings<ActionId, AxisId>
where
ActionId: Clone + Eq + Hash + Serialize + Deserialize<'de> + Send + Sync,
AxisId: Clone + Eq + Hash + Serialize + Deserialize<'de> + Send + Sync,
{
pub fn insert_action<B: IntoIterator<Item = Button>>(
&mut self,
id: ActionId,
buttons: B,
) {
let action = buttons.into_iter().collect::<Vec<Button>>();
if let Some(actions) = self.actions.get_mut(&id) {
actions.push(action);
return;
}
let bindings = vec![action];
self.actions.insert(id, bindings);
}
pub fn insert_axis(&mut self, id: AxisId, axis: Axis) {
if let Some(bindings) = self.axes.get_mut(&id) {
bindings.push(axis);
return;
}
let bindings = vec![axis];
self.axes.insert(id, bindings);
}
pub fn new() -> Self {
Self {
actions: AHashMap::new(),
axes: AHashMap::new(),
}
}
}