revi_ui/
key.rs

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        // if key.intersects(KeyModifiers::SHIFT) {
326        //     return Self::Shift;
327        // }
328        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}