Skip to main content

smart_keymap_core/key/
custom.rs

1use core::fmt::Debug;
2use core::marker::PhantomData;
3
4use serde::Deserialize;
5
6use crate::key;
7
8/// Reference for a custom key.
9#[derive(Deserialize, Debug, Clone, Copy, PartialEq)]
10pub struct Ref(pub u8);
11
12/// The context type for keymap callback keys. (No events).
13#[derive(Debug, Clone, Copy, PartialEq)]
14pub struct Context;
15
16impl Context {
17    /// No runtime state to clear.
18    pub fn reset(&mut self) {}
19}
20
21/// The event type for keymap callback keys. (No events).
22#[derive(Debug, Clone, Copy, PartialEq)]
23pub struct Event;
24
25/// The pending key state type for keymap callback keys. (No pending state).
26#[derive(Debug, Clone, Copy, PartialEq)]
27pub struct PendingKeyState;
28
29/// Key state used by [System]. (No state).
30#[derive(Debug, Clone, Copy, PartialEq)]
31pub struct KeyState;
32
33/// The [key::System] implementation for custom keys.
34#[derive(Debug, Clone, Copy, PartialEq)]
35pub struct System<R>(PhantomData<R>);
36
37impl<R> System<R> {
38    /// Constructs a new [System] with the given key data.
39    pub const fn new() -> Self {
40        Self(PhantomData)
41    }
42}
43
44impl<R> Default for System<R> {
45    fn default() -> Self {
46        Self::new()
47    }
48}
49
50impl<R: Debug> key::System<R> for System<R> {
51    type Ref = Ref;
52    type Context = Context;
53    type Event = Event;
54    type PendingKeyState = PendingKeyState;
55    type KeyState = KeyState;
56
57    fn new_pressed_key(
58        &self,
59        _keymap_index: u16,
60        _context: &Self::Context,
61        _key_ref: Ref,
62    ) -> (
63        key::PressedKeyResult<R, Self::PendingKeyState, Self::KeyState>,
64        key::KeyEvents<Self::Event>,
65    ) {
66        let pkr = key::PressedKeyResult::Resolved(KeyState);
67        let pke = key::KeyEvents::no_events();
68        (pkr, pke)
69    }
70
71    fn update_pending_state(
72        &self,
73        _pending_state: &mut Self::PendingKeyState,
74        _keymap_index: u16,
75        _context: &Self::Context,
76        _key_ref: Ref,
77        _event: key::Event<Self::Event>,
78    ) -> (Option<key::NewPressedKey<R>>, key::KeyEvents<Self::Event>) {
79        panic!()
80    }
81
82    fn update_state(
83        &self,
84        _key_state: &mut Self::KeyState,
85        _ref: &Self::Ref,
86        _context: &Self::Context,
87        _keymap_index: u16,
88        _event: key::Event<Self::Event>,
89    ) -> key::KeyEvents<Self::Event> {
90        panic!()
91    }
92
93    fn key_output(
94        &self,
95        Ref(custom_code): &Self::Ref,
96        _key_state: &Self::KeyState,
97    ) -> Option<key::KeyOutput> {
98        Some(key::KeyOutput::from_custom_code(*custom_code))
99    }
100}
101
102#[cfg(test)]
103mod tests {
104    use super::*;
105
106    #[test]
107    fn test_sizeof_ref() {
108        assert_eq!(1, core::mem::size_of::<Ref>());
109    }
110
111    #[test]
112    fn test_sizeof_event() {
113        assert_eq!(0, core::mem::size_of::<Event>());
114    }
115}