Skip to main content

smart_keymap_core/key/
consumer.rs

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