1use serde::{Deserialize, Serialize};
2use serde_repr::{Deserialize_repr, Serialize_repr};
3
4use crate::{
5 input::{ActionState, KeyCode},
6 message::{MessageMeta, MessageType},
7};
8
9#[derive(Debug, Clone, Serialize, Deserialize)]
11pub struct RegisterAction {
12 pub id: String,
13 pub default_key: KeyCode,
14}
15
16impl RegisterAction {
17 pub fn new(id: String, default_key: KeyCode) -> Self {
18 Self { id, default_key }
19 }
20}
21
22impl<T: Into<String>> From<(T, KeyCode)> for RegisterAction {
23 fn from((id, default_key): (T, KeyCode)) -> Self {
24 Self::new(id.into(), default_key)
25 }
26}
27
28#[derive(Debug, Default, Clone, Serialize, Deserialize)]
29pub struct ActionsBuilder(Vec<RegisterAction>);
30
31impl ActionsBuilder {
32 pub fn new() -> Self {
33 Self::default()
34 }
35
36 pub fn push(mut self, id: impl Into<String>, default_key: KeyCode) -> Self {
37 self.0.push(RegisterAction::new(id.into(), default_key));
38 self
39 }
40
41 pub fn build(self) -> Vec<RegisterAction> {
42 self.0
43 }
44}
45
46#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
48pub struct ActionEvent {
49 pub name: String,
50 pub state: ActionState,
51}
52
53impl MessageType for ActionEvent {
54 const MESSAGE_META: MessageMeta = MessageMeta::new("builtin", "action_event", None);
55}
56
57#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize_repr, Deserialize_repr)]
59#[repr(u8)]
60pub enum ActionKind {
61 Pressed = 1,
62 Released = 2,
63}