requestty_ui/events/
crossterm.rs1use std::convert::{TryFrom, TryInto};
2
3use crossterm::event;
4
5use super::EventIterator;
6
7#[derive(Debug, Default)]
9#[cfg_attr(docsrs, doc(cfg(feature = "crossterm")))]
10#[non_exhaustive]
11pub struct CrosstermEvents {}
12
13impl CrosstermEvents {
14 pub fn new() -> Self {
16 Self {}
17 }
18}
19
20impl EventIterator for CrosstermEvents {
21 fn next_event(&mut self) -> std::io::Result<super::KeyEvent> {
22 loop {
23 if let event::Event::Key(k) = event::read()? {
24 if let Ok(k) = k.try_into() {
25 return Ok(k);
26 }
27 }
28 }
29 }
30}
31
32impl TryFrom<event::KeyEvent> for super::KeyEvent {
33 type Error = ();
34
35 fn try_from(event: event::KeyEvent) -> Result<Self, ()> {
36 let code = match event.code {
37 event::KeyCode::Backspace => super::KeyCode::Backspace,
38 event::KeyCode::Enter => super::KeyCode::Enter,
39 event::KeyCode::Left => super::KeyCode::Left,
40 event::KeyCode::Right => super::KeyCode::Right,
41 event::KeyCode::Up => super::KeyCode::Up,
42 event::KeyCode::Down => super::KeyCode::Down,
43 event::KeyCode::Home => super::KeyCode::Home,
44 event::KeyCode::End => super::KeyCode::End,
45 event::KeyCode::PageUp => super::KeyCode::PageUp,
46 event::KeyCode::PageDown => super::KeyCode::PageDown,
47 event::KeyCode::Tab => super::KeyCode::Tab,
48 event::KeyCode::BackTab => super::KeyCode::BackTab,
49 event::KeyCode::Delete => super::KeyCode::Delete,
50 event::KeyCode::Insert => super::KeyCode::Insert,
51 event::KeyCode::F(f) => super::KeyCode::F(f),
52 event::KeyCode::Char(c) => super::KeyCode::Char(c),
53 event::KeyCode::Null => super::KeyCode::Null,
54 event::KeyCode::Esc => super::KeyCode::Esc,
55 _ => return Err(()),
56 };
57
58 let mut modifiers = super::KeyModifiers::empty();
59
60 if event.modifiers.contains(event::KeyModifiers::SHIFT) {
61 modifiers |= super::KeyModifiers::SHIFT;
62 }
63 if event.modifiers.contains(event::KeyModifiers::CONTROL) {
64 modifiers |= super::KeyModifiers::CONTROL;
65 }
66 if event.modifiers.contains(event::KeyModifiers::ALT) {
67 modifiers |= super::KeyModifiers::ALT;
68 }
69
70 Ok(super::KeyEvent { code, modifiers })
71 }
72}