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