smart_keymap_core/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
33impl Context {
34 pub fn reset(&mut self) {}
36}
37
38#[derive(Debug, Clone, Copy, PartialEq)]
40pub struct Event;
41
42#[derive(Debug, Clone, Copy, PartialEq)]
44pub struct PendingKeyState;
45
46#[derive(Debug, Clone, Copy, PartialEq)]
48pub struct KeyState;
49
50#[derive(Debug, Clone, Copy, PartialEq)]
52pub struct System<R, Keys: Index<usize, Output = Key>> {
53 keys: Keys,
54 marker: PhantomData<R>,
55}
56
57impl<R, Keys: Index<usize, Output = Key>> System<R, Keys> {
58 pub const fn new(keys: Keys) -> Self {
62 Self {
63 keys,
64 marker: PhantomData,
65 }
66 }
67}
68
69impl<R: Debug, Keys: Debug + Index<usize, Output = Key>> key::System<R> for System<R, Keys> {
70 type Ref = Ref;
71 type Context = Context;
72 type Event = Event;
73 type PendingKeyState = PendingKeyState;
74 type KeyState = KeyState;
75
76 fn new_pressed_key(
77 &self,
78 _keymap_index: u16,
79 _context: &Self::Context,
80 Ref(key_index): Ref,
81 ) -> (
82 key::PressedKeyResult<R, Self::PendingKeyState, Self::KeyState>,
83 key::KeyEvents<Self::Event>,
84 ) {
85 let &Key { keymap_callback } = &self.keys[key_index as usize];
86 let pkr = key::PressedKeyResult::NewPressedKey(key::NewPressedKey::NoOp);
87 let km_ev = crate::keymap::KeymapEvent::Callback(keymap_callback);
88 let pke = key::KeyEvents::event(key::Event::Keymap(km_ev));
89 (pkr, pke)
90 }
91
92 fn update_pending_state(
93 &self,
94 _pending_state: &mut Self::PendingKeyState,
95 _keymap_index: u16,
96 _context: &Self::Context,
97 _key_ref: Ref,
98 _event: key::Event<Self::Event>,
99 ) -> (Option<key::NewPressedKey<R>>, key::KeyEvents<Self::Event>) {
100 panic!()
101 }
102
103 fn update_state(
104 &self,
105 _key_state: &mut Self::KeyState,
106 _ref: &Self::Ref,
107 _context: &Self::Context,
108 _keymap_index: u16,
109 _event: key::Event<Self::Event>,
110 ) -> key::KeyEvents<Self::Event> {
111 panic!()
112 }
113
114 fn key_output(
115 &self,
116 _key_ref: &Self::Ref,
117 _key_state: &Self::KeyState,
118 ) -> Option<key::KeyOutput> {
119 panic!()
120 }
121}
122
123#[cfg(test)]
124mod tests {
125 use super::*;
126
127 #[test]
128 fn test_sizeof_ref() {
129 assert_eq!(1, core::mem::size_of::<Ref>());
130 }
131
132 #[test]
133 fn test_sizeof_event() {
134 assert_eq!(0, core::mem::size_of::<Event>());
135 }
136}