1use std::{fmt::Debug, ops::Deref};
2
3use serde::{Deserialize, Serialize};
4
5use crate::bindings::{
6 axis::{GamepadAxis, KeyboardAxis, MouseAxis},
7 button::{GamepadButton, KeyboardButton, MouseButton},
8};
9
10pub mod axis;
11pub mod button;
12
13pub(self) macro implement_into($ty:ty) {
14 impl Into<usize> for $ty {
15 fn into(self) -> usize {
16 return self as usize;
17 }
18 }
19}
20
21#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Serialize, Deserialize)]
22#[serde(bound = "TButton: for<'a> Deserialize<'a>, TAxis: for<'a> Deserialize<'a>")]
23pub enum BoundButton<TButton, TAxis>
24where
25 TButton: Sized + Debug + Clone + Copy + PartialEq + PartialOrd + Serialize,
26 TAxis: Sized + Debug + Clone + Copy + PartialEq + PartialOrd + Serialize,
27{
28 Analog { axis: TAxis, threshold: f32 },
29 Digital(TButton),
30}
31
32#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Serialize, Deserialize)]
33#[serde(bound = "TButton: for<'a> Deserialize<'a>, TAxis: for<'a> Deserialize<'a>")]
34pub enum BoundAxis<TButton, TAxis>
35where
36 TButton: Sized + Debug + Clone + Copy + PartialEq + PartialOrd + Serialize,
37 TAxis: Sized + Debug + Clone + Copy + PartialEq + PartialOrd + Serialize,
38{
39 Analog(TAxis),
40 Digital(TButton),
41 MultiDigital {
42 negative: TButton,
43 positive: TButton,
44 },
45}
46
47#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Serialize, Deserialize)]
48pub enum DigitalBinding {
49 Keyboard(BoundButton<KeyboardButton, KeyboardAxis>),
50 Mouse(BoundButton<MouseButton, MouseAxis>),
51 Gamepad(BoundButton<GamepadButton, GamepadAxis>),
52}
53
54#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Serialize, Deserialize)]
55pub enum AnalogBindingKind {
56 Keyboard(BoundAxis<KeyboardButton, KeyboardAxis>),
57 Mouse(BoundAxis<MouseButton, MouseAxis>),
58 Gamepad(BoundAxis<GamepadButton, GamepadAxis>),
59}
60
61#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Serialize, Deserialize)]
62pub struct AnalogBinding {
63 #[serde(flatten)]
64 pub axis: AnalogBindingKind,
65 pub deadzone: f32,
66 pub scale: f32,
67}
68
69#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Serialize, Deserialize)]
70pub enum VectorBindingKind {
71 Keyboard {
72 x: BoundAxis<KeyboardButton, KeyboardAxis>,
73 y: BoundAxis<KeyboardButton, KeyboardAxis>,
74 },
75 Mouse {
76 x: BoundAxis<MouseButton, MouseAxis>,
77 y: BoundAxis<MouseButton, MouseAxis>,
78 },
79 Gamepad {
80 x: BoundAxis<GamepadButton, GamepadAxis>,
81 y: BoundAxis<GamepadButton, GamepadAxis>,
82 },
83}
84
85#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Serialize, Deserialize)]
86pub struct VectorBinding {
87 #[serde(flatten)]
88 pub axes: VectorBindingKind,
89 pub deadzone: f32,
90 pub scale: (f32, f32),
91}
92
93#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)]
94pub enum DefaultBindingType<'a> {
95 Digital(&'a [DigitalBinding]),
96 Analog(&'a [AnalogBinding]),
97 Vector(&'a [VectorBinding]),
98}
99
100#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)]
101pub struct DefaultBinding {
102 pub name: &'static str,
103 pub bindings: DefaultBindingType<'static>,
104}
105
106impl Deref for DefaultBinding {
107 type Target = str;
108
109 fn deref(&self) -> &Self::Target {
110 return self.name;
111 }
112}