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