smart_keymap/key/
callback.rs

1use 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/// Reference for a keymap callback key.
12#[derive(Deserialize, Debug, Clone, Copy, PartialEq)]
13pub struct Ref(pub u8);
14
15/// A key for keymap callbacks.
16#[derive(Deserialize, Debug, Clone, Copy, PartialEq)]
17pub struct Key {
18    /// The keymap callback
19    pub keymap_callback: KeymapCallback,
20}
21
22impl Key {
23    /// Constructs a key with the given key_code.
24    pub const fn new(keymap_callback: KeymapCallback) -> Self {
25        Key { keymap_callback }
26    }
27}
28
29/// The context type for keymap callback keys. (No events).
30#[derive(Debug, Clone, Copy, PartialEq)]
31pub struct Context;
32
33/// The event type for keymap callback keys. (No events).
34#[derive(Debug, Clone, Copy, PartialEq)]
35pub struct Event;
36
37/// The pending key state type for keymap callback keys. (No pending state).
38#[derive(Debug, Clone, Copy, PartialEq)]
39pub struct PendingKeyState;
40
41/// Key state used by [System]. (No state).
42#[derive(Debug, Clone, Copy, PartialEq)]
43pub struct KeyState;
44
45/// The [key::System] implementation for keymap callback keys.
46#[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    /// Constructs a new [System] with the given key data.
54    ///
55    /// The key data is for keys with both key codes and modifiers.
56    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}