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">,<</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&</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// }