use crate::input::{BindableActionInfo, navigation_bindable_actions};
use crate::keybindings::NavigationAction;
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct ActionRegistry<A> {
entries: Vec<BindableActionInfo<A>>,
}
impl<A> ActionRegistry<A> {
pub fn from_entries(entries: Vec<BindableActionInfo<A>>) -> Self {
Self { entries }
}
pub fn entries(&self) -> &[BindableActionInfo<A>] {
&self.entries
}
pub fn extend(&mut self, more: impl IntoIterator<Item = BindableActionInfo<A>>) {
self.entries.extend(more);
}
}
impl<A: From<NavigationAction>> ActionRegistry<A> {
pub fn navigation() -> Self {
Self::from_entries(navigation_bindable_actions::<A>())
}
}
#[cfg(feature = "canvas")]
impl<A: From<NavigationAction> + From<crate::canvas::CanvasAction>> ActionRegistry<A> {
pub fn navigation_with_canvas() -> Self {
let mut registry = Self::navigation();
registry.extend(crate::canvas::canvas_bindable_actions::<A>());
registry
}
}
impl<A: Clone> ActionRegistry<A> {
pub fn resolve(&self, name: &str) -> Option<A> {
self.entries
.iter()
.find(|entry| entry.name == name)
.map(|entry| entry.action.clone())
}
}
impl<A: PartialEq> ActionRegistry<A> {
pub fn name_of(&self, action: &A) -> Option<&'static str> {
self.entries
.iter()
.find(|entry| &entry.action == action)
.map(|entry| entry.name)
}
}