Skip to main content

kimun_notes/keys/
key_strike.rs

1use std::fmt::Display;
2
3use serde::{Deserialize, Serialize};
4
5#[derive(
6    Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize,
7)]
8#[serde(try_from = "String", into = "String")]
9pub enum KeyStrike {
10    #[default]
11    None,
12    Unknown,
13    /// <code class="keycap">`~</code> on a US keyboard. This is the <code class="keycap">半角/全角/漢字</code> (<span class="unicode">hankaku/zenkaku/kanji</span>) key on Japanese keyboards
14    Backquote,
15    /// Used for both the US <code class="keycap">\|</code> (on the 101-key layout) and also for the key
16    /// located between the <code class="keycap">"</code> and <code class="keycap">Enter</code> keys on row C of the 102-,
17    /// 104- and 106-key layouts.
18    /// Labelled <code class="keycap">#~</code> on a UK (102) keyboard.
19    Backslash,
20    /// <code class="keycap">[{</code> on a US keyboard.
21    BracketLeft,
22    /// <code class="keycap">]}</code> on a US keyboard.
23    BracketRight,
24    /// <code class="keycap">,&lt;</code> on a US keyboard.
25    Comma,
26    /// <code class="keycap">0)</code> on a US keyboard.
27    Digit0,
28    /// <code class="keycap">1!</code> on a US keyboard.
29    Digit1,
30    /// <code class="keycap">2@</code> on a US keyboard.
31    Digit2,
32    /// <code class="keycap">3#</code> on a US keyboard.
33    Digit3,
34    /// <code class="keycap">4$</code> on a US keyboard.
35    Digit4,
36    /// <code class="keycap">5%</code> on a US keyboard.
37    Digit5,
38    /// <code class="keycap">6^</code> on a US keyboard.
39    Digit6,
40    /// <code class="keycap">7&amp;</code> on a US keyboard.
41    Digit7,
42    /// <code class="keycap">8*</code> on a US keyboard.
43    Digit8,
44    /// <code class="keycap">9(</code> on a US keyboard.
45    Digit9,
46    /// <code class="keycap">=+</code> on a US keyboard.
47    Equal,
48    /// Located between the left <code class="keycap">Shift</code> and <code class="keycap">Z</code> keys.
49    /// Labelled <code class="keycap">\|</code> on a UK keyboard.
50    KeyA,
51    /// <code class="keycap">b</code> on a US keyboard.
52    KeyB,
53    /// <code class="keycap">c</code> on a US keyboard.
54    KeyC,
55    /// <code class="keycap">d</code> on a US keyboard.
56    KeyD,
57    /// <code class="keycap">e</code> on a US keyboard.
58    KeyE,
59    /// <code class="keycap">f</code> on a US keyboard.
60    KeyF,
61    /// <code class="keycap">g</code> on a US keyboard.
62    KeyG,
63    /// <code class="keycap">h</code> on a US keyboard.
64    KeyH,
65    /// <code class="keycap">i</code> on a US keyboard.
66    KeyI,
67    /// <code class="keycap">j</code> on a US keyboard.
68    KeyJ,
69    /// <code class="keycap">k</code> on a US keyboard.
70    KeyK,
71    /// <code class="keycap">l</code> on a US keyboard.
72    KeyL,
73    /// <code class="keycap">m</code> on a US keyboard.
74    KeyM,
75    /// <code class="keycap">n</code> on a US keyboard.
76    KeyN,
77    /// <code class="keycap">o</code> on a US keyboard.
78    KeyO,
79    /// <code class="keycap">p</code> on a US keyboard.
80    KeyP,
81    /// <code class="keycap">q</code> on a US keyboard.
82    /// Labelled <code class="keycap">a</code> on an AZERTY (e.g., French) keyboard.
83    KeyQ,
84    /// <code class="keycap">r</code> on a US keyboard.
85    KeyR,
86    /// <code class="keycap">s</code> on a US keyboard.
87    KeyS,
88    /// <code class="keycap">t</code> on a US keyboard.
89    KeyT,
90    /// <code class="keycap">u</code> on a US keyboard.
91    KeyU,
92    /// <code class="keycap">v</code> on a US keyboard.
93    KeyV,
94    /// <code class="keycap">w</code> on a US keyboard.
95    /// Labelled <code class="keycap">z</code> on an AZERTY (e.g., French) keyboard.
96    KeyW,
97    /// <code class="keycap">x</code> on a US keyboard.
98    KeyX,
99    /// <code class="keycap">y</code> on a US keyboard.
100    /// Labelled <code class="keycap">z</code> on a QWERTZ (e.g., German) keyboard.
101    KeyY,
102    /// <code class="keycap">z</code> on a US keyboard.
103    /// Labelled <code class="keycap">w</code> on an AZERTY (e.g., French) keyboard, and <code class="keycap">y</code> on a
104    /// QWERTZ (e.g., German) keyboard.
105    KeyZ,
106    /// <code class="keycap">-_</code> on a US keyboard.
107    Minus,
108    /// <code class="keycap">.></code> on a US keyboard.
109    Period,
110    /// <code class="keycap">'"</code> on a US keyboard.
111    Quote,
112    /// <code class="keycap">;:</code> on a US keyboard.
113    Semicolon,
114    /// <code class="keycap">/?</code> on a US keyboard.
115    Slash,
116    /// <code class="keycap">Backspace</code> or <code class="keycap">⌫</code>.
117    /// Labelled <code class="keycap">Delete</code> on Apple keyboards.
118    Backspace,
119    /// <code class="keycap">CapsLock</code> or <code class="keycap">⇪</code>
120    Enter,
121    /// <code class="keycap"> </code> (space)
122    Space,
123    /// <code class="keycap">Tab</code> or <code class="keycap">⇥</code>
124    Tab,
125    Delete,
126    /// <code class="keycap">End</code> or <code class="keycap">↘</code>
127    End,
128    /// <code class="keycap">Home</code> or <code class="keycap">↖</code>
129    Home,
130    /// <code class="keycap">Insert</code> or <code class="keycap">Ins</code>. Not present on Apple keyboards.
131    Insert,
132    /// <code class="keycap">Page Down</code>, <code class="keycap">PgDn</code> or <code class="keycap">⇟</code>
133    PageDown,
134    /// <code class="keycap">Page Up</code>, <code class="keycap">PgUp</code> or <code class="keycap">⇞</code>
135    PageUp,
136    /// <code class="keycap">↓</code>
137    ArrowDown,
138    /// <code class="keycap">←</code>
139    ArrowLeft,
140    /// <code class="keycap">→</code>
141    ArrowRight,
142    /// <code class="keycap">↑</code>
143    ArrowUp,
144    /// <code class="keycap">Esc</code> or <code class="keycap">⎋</code>
145    Escape,
146    /// <code class="keycap">PrtScr SysRq</code> or <code class="keycap">Print Screen</code>
147    PrintScreen,
148    /// <code class="keycap">Scroll Lock</code>
149    ScrollLock,
150    /// <code class="keycap">Pause Break</code>
151    Pause,
152    /// Some laptops place this key to the left of the <code class="keycap">↑</code> key.
153    /// <code class="keycap">F1</code>
154    F1,
155    /// <code class="keycap">F2</code>
156    F2,
157    /// <code class="keycap">F3</code>
158    F3,
159    /// <code class="keycap">F4</code>
160    F4,
161    /// <code class="keycap">F5</code>
162    F5,
163    /// <code class="keycap">F6</code>
164    F6,
165    /// <code class="keycap">F7</code>
166    F7,
167    /// <code class="keycap">F8</code>
168    F8,
169    /// <code class="keycap">F9</code>
170    F9,
171    /// <code class="keycap">F10</code>
172    F10,
173    /// <code class="keycap">F11</code>
174    F11,
175    /// <code class="keycap">F12</code>
176    F12,
177    /// <code class="keycap">F13</code>
178    F13,
179    /// <code class="keycap">F14</code>
180    F14,
181    /// <code class="keycap">F15</code>
182    F15,
183    /// <code class="keycap">F16</code>
184    F16,
185    /// <code class="keycap">F17</code>
186    F17,
187    /// <code class="keycap">F18</code>
188    F18,
189    /// <code class="keycap">F19</code>
190    F19,
191    /// <code class="keycap">F20</code>
192    F20,
193    /// <code class="keycap">F21</code>
194    F21,
195    /// <code class="keycap">F22</code>
196    F22,
197    /// <code class="keycap">F23</code>
198    F23,
199    /// <code class="keycap">F24</code>
200    F24,
201    /// <code class="keycap">F25</code>
202    F25,
203    /// <code class="keycap">F26</code>
204    F26,
205    /// <code class="keycap">F27</code>
206    F27,
207    /// <code class="keycap">F28</code>
208    F28,
209    /// <code class="keycap">F29</code>
210    F29,
211    /// <code class="keycap">F30</code>
212    F30,
213    /// <code class="keycap">F31</code>
214    F31,
215    /// <code class="keycap">F32</code>
216    F32,
217    /// <code class="keycap">F33</code>
218    F33,
219    /// <code class="keycap">F34</code>
220    F34,
221    /// <code class="keycap">F35</code>
222    F35,
223}
224
225impl Display for KeyStrike {
226    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
227        let text = match self {
228            KeyStrike::None => "<none>",
229            KeyStrike::Unknown => "N/A",
230            KeyStrike::Backquote => "`",
231            KeyStrike::Backslash => "\\",
232            KeyStrike::BracketLeft => "[",
233            KeyStrike::BracketRight => "]",
234            KeyStrike::Comma => ",",
235            KeyStrike::Digit0 => "0",
236            KeyStrike::Digit1 => "1",
237            KeyStrike::Digit2 => "2",
238            KeyStrike::Digit3 => "3",
239            KeyStrike::Digit4 => "4",
240            KeyStrike::Digit5 => "5",
241            KeyStrike::Digit6 => "6",
242            KeyStrike::Digit7 => "7",
243            KeyStrike::Digit8 => "8",
244            KeyStrike::Digit9 => "9",
245            KeyStrike::Equal => "=",
246            KeyStrike::KeyA => "A",
247            KeyStrike::KeyB => "B",
248            KeyStrike::KeyC => "C",
249            KeyStrike::KeyD => "D",
250            KeyStrike::KeyE => "E",
251            KeyStrike::KeyF => "F",
252            KeyStrike::KeyG => "G",
253            KeyStrike::KeyH => "H",
254            KeyStrike::KeyI => "I",
255            KeyStrike::KeyJ => "J",
256            KeyStrike::KeyK => "K",
257            KeyStrike::KeyL => "L",
258            KeyStrike::KeyM => "M",
259            KeyStrike::KeyN => "N",
260            KeyStrike::KeyO => "O",
261            KeyStrike::KeyP => "P",
262            KeyStrike::KeyQ => "Q",
263            KeyStrike::KeyR => "R",
264            KeyStrike::KeyS => "S",
265            KeyStrike::KeyT => "T",
266            KeyStrike::KeyU => "U",
267            KeyStrike::KeyV => "V",
268            KeyStrike::KeyW => "W",
269            KeyStrike::KeyX => "X",
270            KeyStrike::KeyY => "Y",
271            KeyStrike::KeyZ => "Z",
272            KeyStrike::Minus => "-",
273            KeyStrike::Period => ".",
274            KeyStrike::Quote => "'",
275            KeyStrike::Semicolon => ";",
276            KeyStrike::Slash => "/",
277            KeyStrike::Backspace => "<Backspace>",
278            KeyStrike::Enter => "<Enter>",
279            KeyStrike::Space => "<Space>",
280            KeyStrike::Tab => "<Tab>",
281            KeyStrike::Delete => "<Del>",
282            KeyStrike::End => "<End>",
283            KeyStrike::Home => "<Home>",
284            KeyStrike::Insert => "<Insert>",
285            KeyStrike::PageDown => "<PgDn>",
286            KeyStrike::PageUp => "<PgUp>",
287            KeyStrike::ArrowDown => "↓",
288            KeyStrike::ArrowLeft => "←",
289            KeyStrike::ArrowRight => "→",
290            KeyStrike::ArrowUp => "↑",
291            KeyStrike::Escape => "<Esc>",
292            KeyStrike::PrintScreen => "<PrintScreen>",
293            KeyStrike::ScrollLock => "<ScrlLock>",
294            KeyStrike::Pause => "<Pause>",
295            KeyStrike::F1 => "<F1>",
296            KeyStrike::F2 => "F2",
297            KeyStrike::F3 => "F3",
298            KeyStrike::F4 => "F4",
299            KeyStrike::F5 => "F5",
300            KeyStrike::F6 => "F6",
301            KeyStrike::F7 => "F7",
302            KeyStrike::F8 => "F8",
303            KeyStrike::F9 => "F9",
304            KeyStrike::F10 => "F10",
305            KeyStrike::F11 => "F11",
306            KeyStrike::F12 => "F12",
307            KeyStrike::F13 => "F13",
308            KeyStrike::F14 => "F14",
309            KeyStrike::F15 => "F15",
310            KeyStrike::F16 => "F16",
311            KeyStrike::F17 => "F17",
312            KeyStrike::F18 => "F18",
313            KeyStrike::F19 => "F19",
314            KeyStrike::F20 => "F20",
315            KeyStrike::F21 => "F21",
316            KeyStrike::F22 => "F22",
317            KeyStrike::F23 => "F23",
318            KeyStrike::F24 => "F24",
319            KeyStrike::F25 => "F25",
320            KeyStrike::F26 => "F26",
321            KeyStrike::F27 => "F27",
322            KeyStrike::F28 => "F28",
323            KeyStrike::F29 => "F29",
324            KeyStrike::F30 => "F30",
325            KeyStrike::F31 => "F31",
326            KeyStrike::F32 => "F32",
327            KeyStrike::F33 => "F33",
328            KeyStrike::F34 => "F34",
329            KeyStrike::F35 => "F35",
330        };
331        write!(f, "{}", text)
332    }
333}
334
335impl TryFrom<String> for KeyStrike {
336    type Error = String;
337
338    fn try_from(value: String) -> Result<Self, Self::Error> {
339        let value = match value.as_str() {
340            "a" => KeyStrike::KeyA,
341            "b" => KeyStrike::KeyB,
342            "c" => KeyStrike::KeyC,
343            "d" => KeyStrike::KeyD,
344            "e" => KeyStrike::KeyE,
345            "f" => KeyStrike::KeyF,
346            "g" => KeyStrike::KeyG,
347            "h" => KeyStrike::KeyH,
348            "i" => KeyStrike::KeyI,
349            "j" => KeyStrike::KeyJ,
350            "k" => KeyStrike::KeyK,
351            "l" => KeyStrike::KeyL,
352            "m" => KeyStrike::KeyM,
353            "n" => KeyStrike::KeyN,
354            "o" => KeyStrike::KeyO,
355            "p" => KeyStrike::KeyP,
356            "q" => KeyStrike::KeyQ,
357            "r" => KeyStrike::KeyR,
358            "s" => KeyStrike::KeyS,
359            "t" => KeyStrike::KeyT,
360            "u" => KeyStrike::KeyU,
361            "v" => KeyStrike::KeyV,
362            "w" => KeyStrike::KeyW,
363            "x" => KeyStrike::KeyX,
364            "y" => KeyStrike::KeyY,
365            "z" => KeyStrike::KeyZ,
366            "0" => KeyStrike::Digit0,
367            "1" => KeyStrike::Digit1,
368            "2" => KeyStrike::Digit2,
369            "3" => KeyStrike::Digit3,
370            "4" => KeyStrike::Digit4,
371            "5" => KeyStrike::Digit5,
372            "6" => KeyStrike::Digit6,
373            "7" => KeyStrike::Digit7,
374            "8" => KeyStrike::Digit8,
375            "9" => KeyStrike::Digit9,
376            ";" => KeyStrike::Semicolon,
377            "[" => KeyStrike::BracketLeft,
378            "]" => KeyStrike::BracketRight,
379            "{" => KeyStrike::BracketLeft,
380            "}" => KeyStrike::BracketRight,
381            "\\" => KeyStrike::Backslash,
382            "'" => KeyStrike::Quote,
383            "`" => KeyStrike::Backquote,
384            "/" => KeyStrike::Slash,
385            "-" => KeyStrike::Minus,
386            "=" => KeyStrike::Equal,
387            "." => KeyStrike::Period,
388            "," => KeyStrike::Comma,
389            " " => KeyStrike::Space,
390            // Additional ones to allow deserialization
391            "<Backspace>" => KeyStrike::Backspace,
392            "<Enter>" => KeyStrike::Enter,
393            "<Space>" => KeyStrike::Space,
394            "<Tab>" => KeyStrike::Tab,
395            "<Del>" => KeyStrike::Delete,
396            "<End>" => KeyStrike::End,
397            "<Home>" => KeyStrike::Home,
398            "<Insert>" => KeyStrike::Insert,
399            "<PgDn>" => KeyStrike::PageDown,
400            "<PgUp>" => KeyStrike::PageUp,
401            "↓" => KeyStrike::ArrowDown,
402            "←" => KeyStrike::ArrowLeft,
403            "→" => KeyStrike::ArrowRight,
404            "↑" => KeyStrike::ArrowUp,
405            "<Esc>" => KeyStrike::Escape,
406            "<PrintScreen>" => KeyStrike::PrintScreen,
407            "<ScrlLock>" => KeyStrike::ScrollLock,
408            "<Pause>" => KeyStrike::Pause,
409            "<F1>" => KeyStrike::F1,
410            "F2" => KeyStrike::F2,
411            "F3" => KeyStrike::F3,
412            "F4" => KeyStrike::F4,
413            "F5" => KeyStrike::F5,
414            "F6" => KeyStrike::F6,
415            "F7" => KeyStrike::F7,
416            "F8" => KeyStrike::F8,
417            "F9" => KeyStrike::F9,
418            "F10" => KeyStrike::F10,
419            "F11" => KeyStrike::F11,
420            "F12" => KeyStrike::F12,
421            "F13" => KeyStrike::F13,
422            "F14" => KeyStrike::F14,
423            "F15" => KeyStrike::F15,
424            "F16" => KeyStrike::F16,
425            "F17" => KeyStrike::F17,
426            "F18" => KeyStrike::F18,
427            "F19" => KeyStrike::F19,
428            "F20" => KeyStrike::F20,
429            "F21" => KeyStrike::F21,
430            "F22" => KeyStrike::F22,
431            "F23" => KeyStrike::F23,
432            "F24" => KeyStrike::F24,
433            "F25" => KeyStrike::F25,
434            "F26" => KeyStrike::F26,
435            "F27" => KeyStrike::F27,
436            "F28" => KeyStrike::F28,
437            "F29" => KeyStrike::F29,
438            "F30" => KeyStrike::F30,
439            "F31" => KeyStrike::F31,
440            "F32" => KeyStrike::F32,
441            "F33" => KeyStrike::F33,
442            "F34" => KeyStrike::F34,
443            "F35" => KeyStrike::F35,
444            // Capital letters because serialization
445            "A" => KeyStrike::KeyA,
446            "B" => KeyStrike::KeyB,
447            "C" => KeyStrike::KeyC,
448            "D" => KeyStrike::KeyD,
449            "E" => KeyStrike::KeyE,
450            "F" => KeyStrike::KeyF,
451            "G" => KeyStrike::KeyG,
452            "H" => KeyStrike::KeyH,
453            "I" => KeyStrike::KeyI,
454            "J" => KeyStrike::KeyJ,
455            "K" => KeyStrike::KeyK,
456            "L" => KeyStrike::KeyL,
457            "M" => KeyStrike::KeyM,
458            "N" => KeyStrike::KeyN,
459            "O" => KeyStrike::KeyO,
460            "P" => KeyStrike::KeyP,
461            "Q" => KeyStrike::KeyQ,
462            "R" => KeyStrike::KeyR,
463            "S" => KeyStrike::KeyS,
464            "T" => KeyStrike::KeyT,
465            "U" => KeyStrike::KeyU,
466            "V" => KeyStrike::KeyV,
467            "W" => KeyStrike::KeyW,
468            "X" => KeyStrike::KeyX,
469            "Y" => KeyStrike::KeyY,
470            "Z" => KeyStrike::KeyZ,
471            _ => KeyStrike::Unknown,
472        };
473        Ok(value)
474    }
475}
476
477impl From<KeyStrike> for String {
478    fn from(value: KeyStrike) -> Self {
479        value.to_string()
480    }
481}
482
483// impl From<Key> for KeyStrike {
484//     fn from(value: Key) -> Self {
485//         match value {
486//             Key::Character(char) => {
487//                 let ks = char.clone().try_into().unwrap_or(KeyStrike::Unknown);
488//                 if ks == KeyStrike::Unknown {
489//                     error!("Didn't find a key for {}", char);
490//                 }
491//                 ks
492//             }
493//             Key::Enter => KeyStrike::Enter,
494//             Key::Tab => KeyStrike::Tab,
495//             Key::ArrowDown => KeyStrike::ArrowDown,
496//             Key::ArrowLeft => KeyStrike::ArrowLeft,
497//             Key::ArrowRight => KeyStrike::ArrowRight,
498//             Key::ArrowUp => KeyStrike::ArrowUp,
499//             Key::End => KeyStrike::End,
500//             Key::Home => KeyStrike::Home,
501//             Key::PageDown => KeyStrike::PageDown,
502//             Key::PageUp => KeyStrike::PageUp,
503//             Key::Backspace => KeyStrike::Backspace,
504//             Key::Delete => KeyStrike::Delete,
505//             Key::Insert => KeyStrike::Insert,
506//             Key::Escape => KeyStrike::Escape,
507//             Key::Pause => KeyStrike::Pause,
508//             Key::PrintScreen => KeyStrike::PrintScreen,
509//             Key::ScrollLock => KeyStrike::ScrollLock,
510//             Key::F1 => KeyStrike::F1,
511//             Key::F2 => KeyStrike::F2,
512//             Key::F3 => KeyStrike::F3,
513//             Key::F4 => KeyStrike::F4,
514//             Key::F5 => KeyStrike::F5,
515//             Key::F6 => KeyStrike::F6,
516//             Key::F7 => KeyStrike::F7,
517//             Key::F8 => KeyStrike::F8,
518//             Key::F9 => KeyStrike::F9,
519//             Key::F10 => KeyStrike::F10,
520//             Key::F11 => KeyStrike::F11,
521//             Key::F12 => KeyStrike::F12,
522//             Key::F13 => KeyStrike::F13,
523//             Key::F14 => KeyStrike::F14,
524//             Key::F15 => KeyStrike::F15,
525//             Key::F16 => KeyStrike::F16,
526//             Key::F17 => KeyStrike::F17,
527//             Key::F18 => KeyStrike::F18,
528//             Key::F19 => KeyStrike::F19,
529//             Key::F20 => KeyStrike::F20,
530//             Key::F21 => KeyStrike::F21,
531//             Key::F22 => KeyStrike::F22,
532//             Key::F23 => KeyStrike::F23,
533//             Key::F24 => KeyStrike::F24,
534//             Key::F25 => KeyStrike::F25,
535//             Key::F26 => KeyStrike::F26,
536//             Key::F27 => KeyStrike::F27,
537//             Key::F28 => KeyStrike::F28,
538//             Key::F29 => KeyStrike::F29,
539//             Key::F30 => KeyStrike::F30,
540//             Key::F31 => KeyStrike::F31,
541//             Key::F32 => KeyStrike::F32,
542//             Key::F33 => KeyStrike::F33,
543//             Key::F34 => KeyStrike::F34,
544//             Key::F35 => KeyStrike::F35,
545//             _ => KeyStrike::None,
546//         }
547//     }
548// }