pawkit-input 0.1.23

PawKit's input module
Documentation
use std::fmt::Debug;

use serde::{Deserialize, Serialize};

use crate::binding::{
    axis::{GamepadAxis, KeyboardAxis, MouseAxis},
    button::{GamepadButton, KeyboardButton, MouseButton},
};

pub mod axis;
pub mod button;
pub mod map;

pub(self) macro implement_into($ty:ty) {
    impl Into<usize> for $ty {
        fn into(self) -> usize {
            return self as usize;
        }
    }
}

#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
#[serde(bound = "TButton: for<'a> Deserialize<'a>, TAxis: for<'a> Deserialize<'a>")]
#[serde(tag = "mode")]
pub enum BoundButton<TButton, TAxis>
where
    TButton: Debug + Copy + PartialEq + Serialize,
    TAxis: Debug + Copy + PartialEq + Serialize,
{
    Analog {
        axis: TAxis,
        threshold: f32,
        scale: f32,
    },
    Digital {
        button: TButton,
    },
}

#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
#[serde(bound = "TButton: for<'a> Deserialize<'a>, TAxis: for<'a> Deserialize<'a>")]
#[serde(tag = "mode")]
pub enum BoundAxis<TButton, TAxis>
where
    TButton: Debug + Copy + PartialEq + Serialize,
    TAxis: Debug + Copy + PartialEq + Serialize,
{
    Analog {
        axis: TAxis,
    },
    Digital {
        button: TButton,
    },
    MultiDigital {
        negative: TButton,
        positive: TButton,
    },
}

#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
#[serde(tag = "family")]
pub enum DigitalBinding {
    Keyboard(BoundButton<KeyboardButton, KeyboardAxis>),
    Mouse(BoundButton<MouseButton, MouseAxis>),
    Gamepad(BoundButton<GamepadButton, GamepadAxis>),
}

#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
#[serde(tag = "family")]
pub enum AnalogBindingKind {
    Keyboard(BoundAxis<KeyboardButton, KeyboardAxis>),
    Mouse(BoundAxis<MouseButton, MouseAxis>),
    Gamepad(BoundAxis<GamepadButton, GamepadAxis>),
}

#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct AnalogBinding {
    #[serde(flatten)]
    pub axis: AnalogBindingKind,
    pub deadzone: f32,
    pub scale: f32,
}

#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
#[serde(tag = "family")]
pub enum VectorBindingKind {
    Keyboard {
        x: BoundAxis<KeyboardButton, KeyboardAxis>,
        y: BoundAxis<KeyboardButton, KeyboardAxis>,
    },
    Mouse {
        x: BoundAxis<MouseButton, MouseAxis>,
        y: BoundAxis<MouseButton, MouseAxis>,
    },
    Gamepad {
        x: BoundAxis<GamepadButton, GamepadAxis>,
        y: BoundAxis<GamepadButton, GamepadAxis>,
    },
}

#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct VectorBinding {
    #[serde(flatten)]
    pub axes: VectorBindingKind,
    pub deadzone: f32,
    pub scale: (f32, f32),
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", content = "bindings")]
pub enum BindingList {
    Digital(Vec<DigitalBinding>),
    Analog(Vec<AnalogBinding>),
    Vector(Vec<VectorBinding>),
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
pub enum BindingKind {
    Digital,
    Analog,
    Vector,
}