lighthouse_protocol/input/
input_event.rs

1use serde::{Deserialize, Serialize};
2
3use super::{GamepadEvent, KeyEvent, MouseEvent};
4
5/// A user input event, as generated by the new frontend (LUNA).
6#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
7#[serde(tag = "type", rename_all = "camelCase")]
8pub enum InputEvent {
9    Key(KeyEvent),
10    Mouse(MouseEvent),
11    Gamepad(GamepadEvent),
12}
13
14#[cfg(test)]
15mod tests {
16    use serde_json::json;
17
18    use crate::{EventSource, GamepadAxisEvent, GamepadButtonEvent, GamepadControlEvent, GamepadEvent, InputEvent, KeyEvent, KeyModifiers, MouseButton, MouseEvent, Pos};
19
20    #[test]
21    fn key_event() {
22        assert_eq!(
23            serde_json::from_value::<InputEvent>(json!({
24                "type": "key",
25                "source": 0,
26                "down": true,
27                "repeat": false,
28                "code": "ArrowUp",
29                "modifiers": {
30                    "alt": false,
31                    "ctrl": false,
32                    "meta": false,
33                    "shift": false,
34                },
35            })).unwrap(),
36            InputEvent::Key(KeyEvent {
37                source: EventSource::Int(0),
38                down: true,
39                repeat: false,
40                code: "ArrowUp".into(),
41                modifiers: KeyModifiers::default(),
42            })
43        );
44    }
45
46    #[test]
47    fn mouse_event() {
48        assert_eq!(
49            serde_json::from_value::<InputEvent>(json!({
50                "type": "mouse",
51                "source": 1,
52                "button": "left",
53                "pos": {
54                    "x": 2,
55                    "y": 4,
56                },
57            })).unwrap(),
58            InputEvent::Mouse(MouseEvent {
59                source: EventSource::Int(1),
60                button: MouseButton::Left,
61                pos: Pos::new(2.0, 4.0),
62            })
63        );
64    }
65
66    #[test]
67    fn gamepad_button_event() {
68        assert_eq!(
69            serde_json::from_value::<InputEvent>(json!({
70                "type": "gamepad",
71                "source": 1,
72                "control": "button",
73                "index": 42,
74                "down": true,
75                "value": 0.25,
76            })).unwrap(),
77            InputEvent::Gamepad(GamepadEvent {
78                source: EventSource::Int(1),
79                control: GamepadControlEvent::Button(GamepadButtonEvent {
80                    index: 42,
81                    down: true,
82                    value: 0.25,
83                }),
84            })
85        );
86    }
87
88    #[test]
89    fn gamepad_axis_event() {
90        assert_eq!(
91            serde_json::from_value::<InputEvent>(json!({
92                "type": "gamepad",
93                "source": 1,
94                "control": "axis",
95                "index": 42,
96                "value": 0.25,
97            })).unwrap(),
98            InputEvent::Gamepad(GamepadEvent {
99                source: EventSource::Int(1),
100                control: GamepadControlEvent::Axis(GamepadAxisEvent {
101                    index: 42,
102                    value: 0.25,
103                }),
104            })
105        );
106    }
107}