1#[allow(dead_code)]
2#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
3pub enum Key {
4 LA,
5 LB,
6 LC,
7 LD,
8 LE,
9 LF,
10 LG,
11 LH,
12 LI,
13 LJ,
14 LK,
15 LL,
16 LM,
17 LN,
18 LO,
19 LP,
20 LQ,
21 LR,
22 LS,
23 LT,
24 LU,
25 LV,
26 LW,
27 LX,
28 LY,
29 LZ,
30 UA,
31 UB,
32 UC,
33 UD,
34 UE,
35 UF,
36 UG,
37 UH,
38 UI,
39 UJ,
40 UK,
41 UL,
42 UM,
43 UN,
44 UO,
45 UP,
46 UQ,
47 UR,
48 US,
49 UT,
50 UU,
51 UV,
52 UW,
53 UX,
54 UY,
55 UZ,
56 N0,
57 N1,
58 N2,
59 N3,
60 N4,
61 N5,
62 N6,
63 N7,
64 N8,
65 N9,
66 F1,
67 F2,
68 F3,
69 F4,
70 F5,
71 F6,
72 F7,
73 F8,
74 F9,
75 F10,
76 F11,
77 F12,
78 Backspace,
79 Enter,
80 Left,
81 Right,
82 Up,
83 Down,
84 Home,
85 End,
86 PageUp,
87 PageDown,
88 Tab,
89 BackTab,
90 Delete,
91 Insert,
92 Esc,
93 Ctrl,
94 Alt,
95 Shift,
96 Space,
97 Null,
98 Colon,
99 SimiColon,
100 Caret,
101 Char(char),
102}
103impl From<u8> for Key {
104 fn from(num: u8) -> Self {
105 match num {
106 1 => Self::F1,
107 2 => Self::F2,
108 3 => Self::F3,
109 4 => Self::F4,
110 5 => Self::F5,
111 6 => Self::F6,
112 7 => Self::F7,
113 8 => Self::F8,
114 9 => Self::F9,
115 10 => Self::F10,
116 11 => Self::F11,
117 _ => Self::F12,
118 }
119 }
120}
121impl From<char> for Key {
122 fn from(c: char) -> Self {
123 match c {
124 'a' => Self::LA,
125 'b' => Self::LB,
126 'c' => Self::LC,
127 'd' => Self::LD,
128 'e' => Self::LE,
129 'f' => Self::LF,
130 'g' => Self::LG,
131 'h' => Self::LH,
132 'i' => Self::LI,
133 'j' => Self::LJ,
134 'k' => Self::LK,
135 'l' => Self::LL,
136 'm' => Self::LM,
137 'n' => Self::LN,
138 'o' => Self::LO,
139 'p' => Self::LP,
140 'q' => Self::LQ,
141 'r' => Self::LR,
142 's' => Self::LS,
143 't' => Self::LT,
144 'u' => Self::LU,
145 'v' => Self::LV,
146 'w' => Self::LW,
147 'x' => Self::LX,
148 'y' => Self::LY,
149 'z' => Self::LZ,
150 'A' => Self::UA,
151 'B' => Self::UB,
152 'C' => Self::UC,
153 'D' => Self::UD,
154 'E' => Self::UE,
155 'F' => Self::UF,
156 'G' => Self::UG,
157 'H' => Self::UH,
158 'I' => Self::UI,
159 'J' => Self::UJ,
160 'K' => Self::UK,
161 'L' => Self::UL,
162 'M' => Self::UM,
163 'N' => Self::UN,
164 'O' => Self::UO,
165 'P' => Self::UP,
166 'Q' => Self::UQ,
167 'R' => Self::UR,
168 'S' => Self::US,
169 'T' => Self::UT,
170 'U' => Self::UU,
171 'V' => Self::UV,
172 'W' => Self::UW,
173 'X' => Self::UX,
174 'Y' => Self::UY,
175 'Z' => Self::UZ,
176 '0' => Self::N0,
177 '1' => Self::N1,
178 '2' => Self::N2,
179 '3' => Self::N3,
180 '4' => Self::N4,
181 '5' => Self::N5,
182 '6' => Self::N6,
183 '7' => Self::N7,
184 '8' => Self::N8,
185 '9' => Self::N9,
186 ':' => Self::Colon,
187 ';' => Self::SimiColon,
188 '^' => Self::Caret,
189 _ => Self::Char(c),
190 }
191 }
192}
193
194impl From<crossterm::event::KeyCode> for Key {
195 fn from(key: crossterm::event::KeyCode) -> Self {
196 use crossterm::event::KeyCode;
197 match key {
198 KeyCode::Backspace => Key::Backspace,
199 KeyCode::Enter => Key::Enter,
200 KeyCode::Left => Key::Left,
201 KeyCode::Right => Key::Right,
202 KeyCode::Up => Key::Up,
203 KeyCode::Down => Key::Down,
204 KeyCode::Home => Key::Home,
205 KeyCode::End => Key::End,
206 KeyCode::PageUp => Key::PageUp,
207 KeyCode::PageDown => Key::PageDown,
208 KeyCode::Tab => Key::Tab,
209 KeyCode::BackTab => Key::BackTab,
210 KeyCode::Delete => Key::Delete,
211 KeyCode::Insert => Key::Insert,
212 KeyCode::F(num) => Self::from(num),
213 KeyCode::Char(c) => Self::from(c),
214 KeyCode::Null => Key::Null,
215 KeyCode::Esc => Key::Esc,
216 }
217 }
218}
219
220impl Key {
221 #[must_use]
222 pub fn try_digit(self) -> Option<usize> {
223 match self {
224 Self::N0 => Some(0),
225 Self::N1 => Some(1),
226 Self::N2 => Some(2),
227 Self::N3 => Some(3),
228 Self::N4 => Some(4),
229 Self::N5 => Some(5),
230 Self::N6 => Some(6),
231 Self::N7 => Some(7),
232 Self::N8 => Some(8),
233 Self::N9 => Some(9),
234 _ => None,
235 }
236 }
237
238 #[must_use]
239 pub fn from_event(key: crossterm::event::KeyEvent) -> (Self, Self) {
240 (Self::from(key.code), Self::from(key.modifiers))
241 }
242
243 #[must_use]
244 pub fn as_char(self) -> char {
245 match self {
246 Self::LA => 'a',
247 Self::LB => 'b',
248 Self::LC => 'c',
249 Self::LD => 'd',
250 Self::LE => 'e',
251 Self::LF => 'f',
252 Self::LG => 'g',
253 Self::LH => 'h',
254 Self::LI => 'i',
255 Self::LJ => 'j',
256 Self::LK => 'k',
257 Self::LL => 'l',
258 Self::LM => 'm',
259 Self::LN => 'n',
260 Self::LO => 'o',
261 Self::LP => 'p',
262 Self::LQ => 'q',
263 Self::LR => 'r',
264 Self::LS => 's',
265 Self::LT => 't',
266 Self::LU => 'u',
267 Self::LV => 'v',
268 Self::LW => 'w',
269 Self::LX => 'x',
270 Self::LY => 'y',
271 Self::LZ => 'z',
272 Self::UA => 'A',
273 Self::UB => 'B',
274 Self::UC => 'C',
275 Self::UD => 'D',
276 Self::UE => 'E',
277 Self::UF => 'F',
278 Self::UG => 'G',
279 Self::UH => 'H',
280 Self::UI => 'I',
281 Self::UJ => 'J',
282 Self::UK => 'K',
283 Self::UL => 'L',
284 Self::UM => 'M',
285 Self::UN => 'N',
286 Self::UO => 'O',
287 Self::UP => 'P',
288 Self::UQ => 'Q',
289 Self::UR => 'R',
290 Self::US => 'S',
291 Self::UT => 'T',
292 Self::UU => 'U',
293 Self::UV => 'V',
294 Self::UW => 'W',
295 Self::UX => 'X',
296 Self::UY => 'Y',
297 Self::UZ => 'Z',
298 Self::N0 => '0',
299 Self::N1 => '1',
300 Self::N2 => '2',
301 Self::N3 => '3',
302 Self::N4 => '4',
303 Self::N5 => '5',
304 Self::N6 => '6',
305 Self::N7 => '7',
306 Self::N8 => '8',
307 Self::N9 => '9',
308 Self::Colon => ':',
309 Self::SimiColon => ';',
310 Self::Char(c) => c,
311 _ => '\0',
312 }
313 }
314}
315
316impl From<crossterm::event::KeyModifiers> for Key {
317 fn from(key: crossterm::event::KeyModifiers) -> Self {
318 use crossterm::event::KeyModifiers;
319 if key.intersects(KeyModifiers::ALT) {
320 return Self::Alt;
321 }
322 if key.intersects(KeyModifiers::CONTROL) {
323 return Self::Ctrl;
324 }
325 Self::Null
329 }
330}
331
332#[test]
333fn test_from_crossterm_key_to_revi_key_colon() {
334 use crossterm::event::{KeyCode, KeyModifiers};
335 let (k1, k2) = (KeyCode::Char(':'), KeyModifiers::SHIFT);
336 let left = (Key::from(k1), Key::from(k2));
337 assert_eq!(left, (Key::Colon, Key::Null));
338}
339
340#[test]
341fn test_from_crossterm_key_to_revi_key_upper_a() {
342 use crossterm::event::{KeyCode, KeyModifiers};
343 let (k1, k2) = (KeyCode::Char('A'), KeyModifiers::SHIFT);
344 let left = (Key::from(k1), Key::from(k2));
345 assert_eq!(left, (Key::UA, Key::Null));
346}