use crate::error::Result;
use crate::mapping::action::InputAction;
use crate::mapping::binding::{BindingConfig, InputBinding};
use crate::mapping::resolver::InputMap;
use std::collections::HashMap;
#[derive(serde::Serialize, serde::Deserialize)]
struct InputMapDto {
bindings: HashMap<InputAction, Vec<BindingConfig>>,
}
pub fn load_from_yaml(content: &str) -> Result<InputMap> {
let dto: InputMapDto = serde_yaml::from_str(content)
.map_err(|e| crate::error::ReactionError::ConfigLoadError(e.to_string()))?;
let mut map = InputMap::new();
for (action, bindings) in dto.bindings {
for binding in bindings {
map.bind(action, binding);
}
}
Ok(map)
}
pub fn load_from_json(content: &str) -> Result<InputMap> {
let dto: InputMapDto = serde_json::from_str(content)
.map_err(|e| crate::error::ReactionError::ConfigLoadError(e.to_string()))?;
let mut map = InputMap::new();
for (action, bindings) in dto.bindings {
for binding in bindings {
map.bind(action, binding);
}
}
Ok(map)
}
#[cfg(feature = "config-files")]
pub fn load_from_ron(content: &str) -> Result<InputMap> {
let dto: InputMapDto = ron::from_str(content)
.map_err(|e| crate::error::ReactionError::ConfigLoadError(e.to_string()))?;
let mut map = InputMap::new();
for (action, bindings) in dto.bindings {
for binding in bindings {
map.bind(action, binding);
}
}
Ok(map)
}