mal/event/
key.rs

1use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
2use serde::{Deserialize, Serialize};
3
4/// Represends a Key Press
5#[derive(PartialEq, Eq, Clone, Copy, Hash, Debug, Deserialize, Serialize)]
6#[serde(rename_all = "snake_case")]
7pub enum Key {
8    Enter,
9    Tab,
10    BackTab,
11    Backspace,
12    Esc,
13    Left,
14    Right,
15    Up,
16    Down,
17    Ins,
18    Delete,
19    Home,
20    PageUp,
21    PageDown,
22    Char(char),
23    Ctrl(char),
24    Alt(char),
25    Unknown,
26    F0,
27    F1,
28    F2,
29    F3,
30    F4,
31    F5,
32    F6,
33    F7,
34    F8,
35    F9,
36    F10,
37    F11,
38    F12,
39}
40
41impl Key {
42    /// Returns the function key corresponding to the given number
43    ///
44    /// 1 -> F1, etc...
45    ///
46    /// # Panics
47    ///
48    /// If `n == 0 || n > 12`
49    pub fn from_f(n: u8) -> Key {
50        match n {
51            0 => Key::F0,
52            1 => Key::F1,
53            2 => Key::F2,
54            3 => Key::F3,
55            4 => Key::F4,
56            5 => Key::F5,
57            6 => Key::F6,
58            7 => Key::F7,
59            8 => Key::F8,
60            9 => Key::F9,
61            10 => Key::F10,
62            11 => Key::F11,
63            12 => Key::F12,
64            _ => panic!("unknown function key: F{}", n),
65        }
66    }
67}
68
69impl From<KeyEvent> for Key {
70    fn from(key_event: KeyEvent) -> Self {
71        match key_event {
72            KeyEvent {
73                code: KeyCode::Enter,
74                ..
75            } => Key::Enter,
76            KeyEvent {
77                code: KeyCode::Tab, ..
78            } => Key::Tab,
79            KeyEvent {
80                code: KeyCode::BackTab,
81                ..
82            } => Key::BackTab,
83            KeyEvent {
84                code: KeyCode::Backspace,
85                ..
86            } => Key::Backspace,
87            KeyEvent {
88                code: KeyCode::Esc, ..
89            } => Key::Esc,
90            KeyEvent {
91                code: KeyCode::Left,
92                ..
93            } => Key::Left,
94            KeyEvent {
95                code: KeyCode::Right,
96                ..
97            } => Key::Right,
98            KeyEvent {
99                code: KeyCode::Up, ..
100            } => Key::Up,
101            KeyEvent {
102                code: KeyCode::Down,
103                ..
104            } => Key::Down,
105            KeyEvent {
106                code: KeyCode::Insert,
107                ..
108            } => Key::Ins,
109            KeyEvent {
110                code: KeyCode::Delete,
111                ..
112            } => Key::Delete,
113            KeyEvent {
114                code: KeyCode::Home,
115                ..
116            } => Key::Home,
117            KeyEvent {
118                code: KeyCode::PageUp,
119                ..
120            } => Key::PageUp,
121            KeyEvent {
122                code: KeyCode::PageDown,
123                ..
124            } => Key::PageDown,
125            KeyEvent {
126                code: KeyCode::Char(c),
127                modifiers: KeyModifiers::ALT,
128                ..
129            } => Key::Alt(c),
130            KeyEvent {
131                code: KeyCode::Char(c),
132                modifiers: KeyModifiers::CONTROL,
133                ..
134            } => Key::Ctrl(c),
135            KeyEvent {
136                code: KeyCode::Char(c),
137                ..
138            } => Key::Char(c),
139            _ => Key::Unknown,
140        }
141    }
142}