use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
use crate::modal::DialogAction;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Dispatch {
TxBytes(Vec<u8>),
OpenedMenu,
ClosedMenu,
Quit,
Action(DialogAction),
Noop,
}
#[must_use]
pub fn key_to_bytes(key: KeyEvent) -> Vec<u8> {
match (key.code, key.modifiers) {
(KeyCode::Char(c), m) if m.contains(KeyModifiers::CONTROL) && c.is_ascii_alphabetic() => {
vec![(c.to_ascii_lowercase() as u8) - b'a' + 1]
}
(KeyCode::Char(c), _) => {
let mut buf = [0u8; 4];
c.encode_utf8(&mut buf).as_bytes().to_vec()
}
(KeyCode::Enter, _) => vec![b'\r'],
(KeyCode::Tab, _) => vec![b'\t'],
(KeyCode::Backspace, _) => vec![0x7f],
(KeyCode::Esc, _) => vec![0x1b],
_ => Vec::new(),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ctrl_a_is_0x01() {
let ev = KeyEvent::new(KeyCode::Char('a'), KeyModifiers::CONTROL);
assert_eq!(key_to_bytes(ev), vec![0x01]);
}
#[test]
fn plain_letter_is_ascii() {
let ev = KeyEvent::new(KeyCode::Char('h'), KeyModifiers::NONE);
assert_eq!(key_to_bytes(ev), vec![b'h']);
}
#[test]
fn enter_is_cr() {
let ev = KeyEvent::new(KeyCode::Enter, KeyModifiers::NONE);
assert_eq!(key_to_bytes(ev), vec![b'\r']);
}
#[test]
fn esc_is_0x1b() {
let ev = KeyEvent::new(KeyCode::Esc, KeyModifiers::NONE);
assert_eq!(key_to_bytes(ev), vec![0x1b]);
}
}