smart_keymap/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
18/// The event type for consumer keys. (No events).
19#[derive(Debug, Clone, Copy, PartialEq)]
20pub struct Event;
21
22/// The pending key state type for consumer keys. (No pending state).
23#[derive(Debug, Clone, Copy, PartialEq)]
24pub struct PendingKeyState;
25
26/// Key state used by [System].
27#[derive(Debug, Clone, Copy, PartialEq)]
28pub struct KeyState;
29
30/// The [key::System] implementation for consumer keys.
31#[derive(Debug, Clone, Copy, PartialEq)]
32pub struct System<R: Debug> {
33    _marker: core::marker::PhantomData<R>,
34}
35
36impl<R: Debug> System<R> {
37    /// Constructs a new [System].
38    pub const fn new() -> Self {
39        Self {
40            _marker: core::marker::PhantomData,
41        }
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        (
62            key::PressedKeyResult::Resolved(KeyState),
63            key::KeyEvents::no_events(),
64        )
65    }
66
67    fn update_pending_state(
68        &self,
69        _pending_state: &mut Self::PendingKeyState,
70        _keymap_index: u16,
71        _context: &Self::Context,
72        _key_ref: Ref,
73        _event: key::Event<Self::Event>,
74    ) -> (Option<key::NewPressedKey<R>>, key::KeyEvents<Self::Event>) {
75        panic!()
76    }
77
78    fn update_state(
79        &self,
80        _key_state: &mut Self::KeyState,
81        _ref: &Self::Ref,
82        _context: &Self::Context,
83        _keymap_index: u16,
84        _event: key::Event<Self::Event>,
85    ) -> key::KeyEvents<Self::Event> {
86        key::KeyEvents::no_events()
87    }
88
89    fn key_output(
90        &self,
91        key_ref: &Self::Ref,
92        _key_state: &Self::KeyState,
93    ) -> Option<key::KeyOutput> {
94        match key_ref {
95            Ref::UsageCode(uc) => Some(key::KeyOutput::from_consumer_code(*uc)),
96        }
97    }
98}
99
100#[cfg(test)]
101mod tests {
102    use super::*;
103
104    #[test]
105    fn test_sizeof_ref() {
106        assert_eq!(1, core::mem::size_of::<Ref>());
107    }
108
109    #[test]
110    fn test_sizeof_event() {
111        assert_eq!(0, core::mem::size_of::<Event>());
112    }
113}