reaction 0.2.0

Universal low-latency input handling for game engines
Documentation
use crate::error::Result;
use crate::mapping::action::InputAction;
use crate::mapping::binding::{BindingConfig, InputBinding};
use crate::mapping::resolver::InputMap;
use std::collections::HashMap;

// Simplified DTO for serialization
#[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)
}