smart_keymap/key/
callback.rs1use core::fmt::Debug;
2use core::marker::PhantomData;
3use core::ops::Index;
4
5use serde::Deserialize;
6
7use crate::key;
8
9use crate::keymap::KeymapCallback;
10
11#[derive(Deserialize, Debug, Clone, Copy, PartialEq)]
13pub struct Ref(pub u8);
14
15#[derive(Deserialize, Debug, Clone, Copy, PartialEq)]
17pub struct Key {
18 pub keymap_callback: KeymapCallback,
20}
21
22impl Key {
23 pub const fn new(keymap_callback: KeymapCallback) -> Self {
25 Key { keymap_callback }
26 }
27}
28
29#[derive(Debug, Clone, Copy, PartialEq)]
31pub struct Context;
32
33#[derive(Debug, Clone, Copy, PartialEq)]
35pub struct Event;
36
37#[derive(Debug, Clone, Copy, PartialEq)]
39pub struct PendingKeyState;
40
41#[derive(Debug, Clone, Copy, PartialEq)]
43pub struct KeyState;
44
45#[derive(Debug, Clone, Copy, PartialEq)]
47pub struct System<R, Keys: Index<usize, Output = Key>> {
48 keys: Keys,
49 marker: PhantomData<R>,
50}
51
52impl<R, Keys: Index<usize, Output = Key>> System<R, Keys> {
53 pub const fn new(keys: Keys) -> Self {
57 Self {
58 keys,
59 marker: PhantomData,
60 }
61 }
62}
63
64impl<R: Debug, Keys: Debug + Index<usize, Output = Key>> key::System<R> for System<R, Keys> {
65 type Ref = Ref;
66 type Context = Context;
67 type Event = Event;
68 type PendingKeyState = PendingKeyState;
69 type KeyState = KeyState;
70
71 fn new_pressed_key(
72 &self,
73 _keymap_index: u16,
74 _context: &Self::Context,
75 Ref(key_index): Ref,
76 ) -> (
77 key::PressedKeyResult<R, Self::PendingKeyState, Self::KeyState>,
78 key::KeyEvents<Self::Event>,
79 ) {
80 let &Key { keymap_callback } = &self.keys[key_index as usize];
81 let pkr = key::PressedKeyResult::NewPressedKey(key::NewPressedKey::NoOp);
82 let km_ev = crate::keymap::KeymapEvent::Callback(keymap_callback);
83 let pke = key::KeyEvents::event(key::Event::Keymap(km_ev));
84 (pkr, pke)
85 }
86
87 fn update_pending_state(
88 &self,
89 _pending_state: &mut Self::PendingKeyState,
90 _keymap_index: u16,
91 _context: &Self::Context,
92 _key_ref: Ref,
93 _event: key::Event<Self::Event>,
94 ) -> (Option<key::NewPressedKey<R>>, key::KeyEvents<Self::Event>) {
95 panic!()
96 }
97
98 fn update_state(
99 &self,
100 _key_state: &mut Self::KeyState,
101 _ref: &Self::Ref,
102 _context: &Self::Context,
103 _keymap_index: u16,
104 _event: key::Event<Self::Event>,
105 ) -> key::KeyEvents<Self::Event> {
106 panic!()
107 }
108
109 fn key_output(
110 &self,
111 _key_ref: &Self::Ref,
112 _key_state: &Self::KeyState,
113 ) -> Option<key::KeyOutput> {
114 panic!()
115 }
116}
117
118#[cfg(test)]
119mod tests {
120 use super::*;
121
122 #[test]
123 fn test_sizeof_ref() {
124 assert_eq!(1, core::mem::size_of::<Ref>());
125 }
126
127 #[test]
128 fn test_sizeof_event() {
129 assert_eq!(0, core::mem::size_of::<Event>());
130 }
131}