use crate::types::{GamepadAxis, GamepadButton, KeyCode, MouseButton};
#[cfg(feature = "config-files")]
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "config-files", derive(Serialize, Deserialize))]
pub enum InputBinding {
Key(KeyCode),
MouseButton(MouseButton),
GamepadButton(GamepadButton),
GamepadAxis(GamepadAxis),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "config-files", derive(Serialize, Deserialize))]
pub struct BindingConfig {
pub input: InputBinding,
#[cfg_attr(feature = "config-files", serde(default))]
pub deadzone: f32,
#[cfg_attr(feature = "config-files", serde(default = "default_scale"))]
pub scale: f32,
}
#[allow(dead_code)]
fn default_scale() -> f32 {
1.0
}
impl BindingConfig {
pub fn new(input: InputBinding) -> Self {
Self {
input,
deadzone: 0.1, scale: 1.0,
}
}
pub fn with_deadzone(mut self, deadzone: f32) -> crate::error::Result<Self> {
if !deadzone.is_finite() || !(0.0..=1.0).contains(&deadzone) {
return Err(crate::error::ReactionError::InvalidConfiguration(format!(
"Deadzone {deadzone} is out of bounds. Must be between 0.0 and 1.0."
)));
}
self.deadzone = deadzone;
Ok(self)
}
pub fn with_scale(mut self, scale: f32) -> crate::error::Result<Self> {
if !scale.is_finite() || scale == 0.0 {
return Err(crate::error::ReactionError::InvalidConfiguration(format!(
"Invalid scale: {scale}. Must be a non-zero finite number."
)));
}
self.scale = scale;
Ok(self)
}
}