lotus_shared/
action.rs

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/// Describes an action that can be registered with the engine.
10#[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/// Describes an event that is sent when an action is triggered.
47#[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/// Describes the kind of action that was triggered.
58#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize_repr, Deserialize_repr)]
59#[repr(u8)]
60pub enum ActionKind {
61    Pressed = 1,
62    Released = 2,
63}