use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
pub fn key_event_to_bytes(event: &KeyEvent) -> Option<Vec<u8>> {
let bytes = match event.code {
KeyCode::Char(c) => {
if event.modifiers.contains(KeyModifiers::CONTROL) {
let ctrl_char = (c.to_ascii_lowercase() as u8).wrapping_sub(b'a' - 1);
vec![ctrl_char]
} else if event.modifiers.contains(KeyModifiers::ALT) {
vec![0x1b, c as u8]
} else {
c.to_string().into_bytes()
}
}
KeyCode::Enter => vec![b'\r'],
KeyCode::Backspace => vec![0x7f],
KeyCode::Tab => vec![b'\t'],
KeyCode::Esc => vec![0x1b],
KeyCode::Up => vec![0x1b, b'[', b'A'],
KeyCode::Down => vec![0x1b, b'[', b'B'],
KeyCode::Right => vec![0x1b, b'[', b'C'],
KeyCode::Left => vec![0x1b, b'[', b'D'],
KeyCode::Home => vec![0x1b, b'[', b'H'],
KeyCode::End => vec![0x1b, b'[', b'F'],
KeyCode::PageUp => vec![0x1b, b'[', b'5', b'~'],
KeyCode::PageDown => vec![0x1b, b'[', b'6', b'~'],
KeyCode::Delete => vec![0x1b, b'[', b'3', b'~'],
KeyCode::Insert => vec![0x1b, b'[', b'2', b'~'],
KeyCode::F(n) => {
match n {
1 => vec![0x1b, b'O', b'P'],
2 => vec![0x1b, b'O', b'Q'],
3 => vec![0x1b, b'O', b'R'],
4 => vec![0x1b, b'O', b'S'],
5 => vec![0x1b, b'[', b'1', b'5', b'~'],
6 => vec![0x1b, b'[', b'1', b'7', b'~'],
7 => vec![0x1b, b'[', b'1', b'8', b'~'],
8 => vec![0x1b, b'[', b'1', b'9', b'~'],
9 => vec![0x1b, b'[', b'2', b'0', b'~'],
10 => vec![0x1b, b'[', b'2', b'1', b'~'],
11 => vec![0x1b, b'[', b'2', b'3', b'~'],
12 => vec![0x1b, b'[', b'2', b'4', b'~'],
_ => return None,
}
}
_ => return None,
};
Some(bytes)
}