1use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
2use serde::{Deserialize, Serialize};
3
4#[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 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}