dkp 0.4.3

dkp — Domain Knowledge Pack management CLI
Documentation
use crossterm::event::{self, Event, KeyCode, KeyEvent, KeyModifiers};

#[derive(Debug)]
pub enum InputEvent {
    Tab,
    BackTab,
    Quit,
    SearchFocus,
    Enter,
    Up,
    Down,
    Char(char),
    Backspace,
    Escape,
    Resize,
}

pub fn next_event(timeout: std::time::Duration) -> anyhow::Result<Option<InputEvent>> {
    if !event::poll(timeout)? {
        return Ok(None);
    }
    match event::read()? {
        Event::Key(k) => Ok(map_key(k)),
        Event::Resize(..) => Ok(Some(InputEvent::Resize)),
        _ => Ok(None),
    }
}

fn map_key(k: KeyEvent) -> Option<InputEvent> {
    match k.code {
        KeyCode::Tab => Some(InputEvent::Tab),
        KeyCode::BackTab => Some(InputEvent::BackTab),
        KeyCode::Char('q') if k.modifiers == KeyModifiers::NONE => Some(InputEvent::Quit),
        KeyCode::Char('/') if k.modifiers == KeyModifiers::NONE => Some(InputEvent::SearchFocus),
        KeyCode::Enter => Some(InputEvent::Enter),
        KeyCode::Up | KeyCode::Char('k') => Some(InputEvent::Up),
        KeyCode::Down | KeyCode::Char('j') => Some(InputEvent::Down),
        KeyCode::Backspace => Some(InputEvent::Backspace),
        KeyCode::Esc => Some(InputEvent::Escape),
        KeyCode::Char(c) => Some(InputEvent::Char(c)),
        _ => None,
    }
}