terminal-keycode 1.1.1

convert bytes from a terminal into keycodes
Documentation
use terminal_keycode::{Decoder,KeyCode};

#[test]
fn keys() {
  let mut decoder = Decoder::new();
  assert_eq![decoder.write(0x1b), vec![]];
  assert_eq![decoder.write(0x5b), vec![]];
  assert_eq![decoder.write(0x35), vec![]];
  assert_eq![decoder.write(0x7e), vec![KeyCode::PageUp]];
  assert_eq![decoder.write(0x61), vec![KeyCode::Char('a')]];
  assert_eq![decoder.write(0x41), vec![KeyCode::Char('A')]];
  assert_eq![decoder.write(0xc3), vec![]];
  assert_eq![decoder.write(0xa9), vec![KeyCode::Char('é')]];
  assert_eq![decoder.write(0xe2), vec![]];
  assert_eq![decoder.write(0x98), vec![]];
  assert_eq![decoder.write(0x83), vec![KeyCode::Char('')]];
  assert_eq![decoder.write(0xd5), vec![]];
  assert_eq![decoder.write(0xf0), vec![KeyCode::Byte(0xd5),KeyCode::Byte(0xf0)]];
  assert_eq![decoder.write(0xeb), vec![]];
  assert_eq![decoder.write(0xa5), vec![]];
  assert_eq![decoder.write(0x1b), vec![KeyCode::Byte(0xeb),KeyCode::Byte(0xa5),KeyCode::Byte(0x1b)]];
  assert_eq![decoder.write(0x1b), vec![]];
  assert_eq![decoder.write(0x5b), vec![]];
  assert_eq![decoder.write(0x31), vec![]];
  assert_eq![decoder.write(0x35), vec![]];
  assert_eq![decoder.write(0x70), vec![
    KeyCode::Escape, KeyCode::Char('['), KeyCode::Char('1'), KeyCode::Char('5'), KeyCode::Char('p')
  ]];
}

#[test]
fn bytes() {
  let mut decoder = Decoder::new();
  let keycodes = vec![
    KeyCode::ArrowUp, KeyCode::ArrowDown, KeyCode::ArrowLeft, KeyCode::ArrowRight,
    KeyCode::CtrlArrowUp, KeyCode::CtrlArrowDown, KeyCode::CtrlArrowLeft, KeyCode::CtrlArrowRight,
    KeyCode::Numpad5, KeyCode::CtrlNumpad5,
    KeyCode::Delete, KeyCode::Insert, KeyCode::Home, KeyCode::End, KeyCode::PageUp, KeyCode::PageDown,
    KeyCode::CtrlDelete, KeyCode::CtrlInsert, KeyCode::CtrlHome, KeyCode::CtrlEnd,
    KeyCode::ShiftDelete, KeyCode::ShiftInsert, KeyCode::ShiftHome, KeyCode::ShiftEnd,
    KeyCode::CtrlPageUp, KeyCode::CtrlPageDown, KeyCode::ShiftPageUp, KeyCode::ShiftPageDown,
    KeyCode::F1, KeyCode::F2, KeyCode::F3, KeyCode::F4, KeyCode::F5, KeyCode::F6,
    KeyCode::F7, KeyCode::F8, KeyCode::F9, KeyCode::F10, KeyCode::F11, KeyCode::F12,
    KeyCode::CtrlF1, KeyCode::CtrlF2, KeyCode::CtrlF3, KeyCode::CtrlF4, KeyCode::CtrlF5, KeyCode::CtrlF6,
    KeyCode::CtrlF7, KeyCode::CtrlF8, KeyCode::CtrlF9, KeyCode::CtrlF10, KeyCode::CtrlF11, KeyCode::CtrlF12,
    KeyCode::ShiftF1, KeyCode::ShiftF2, KeyCode::ShiftF3, KeyCode::ShiftF4, KeyCode::ShiftF5, KeyCode::ShiftF6,
    KeyCode::ShiftF7, KeyCode::ShiftF8, KeyCode::ShiftF9, KeyCode::ShiftF10, KeyCode::ShiftF11, KeyCode::ShiftF12,
    KeyCode::CtrlShiftF1, KeyCode::CtrlShiftF2, KeyCode::CtrlShiftF3, KeyCode::CtrlShiftF4, KeyCode::CtrlShiftF5,
    KeyCode::CtrlShiftF6, KeyCode::CtrlShiftF7, KeyCode::CtrlShiftF8, KeyCode::CtrlShiftF9, KeyCode::CtrlShiftF10,
    KeyCode::CtrlShiftF11, KeyCode::CtrlShiftF12,
    KeyCode::CtrlA, KeyCode::CtrlB, KeyCode::CtrlC, KeyCode::CtrlD, KeyCode::CtrlE,
    KeyCode::CtrlF, KeyCode::CtrlG, KeyCode::CtrlH,
    KeyCode::Tab, KeyCode::ShiftTab, KeyCode::Linefeed, KeyCode::Enter,
    KeyCode::CtrlK, KeyCode::CtrlL, KeyCode::CtrlN, KeyCode::CtrlO, KeyCode::CtrlP,
    KeyCode::CtrlQ, KeyCode::CtrlR, KeyCode::CtrlS, KeyCode::CtrlT, KeyCode::CtrlU,
    KeyCode::CtrlV, KeyCode::CtrlW, KeyCode::CtrlX, KeyCode::CtrlY, KeyCode::CtrlZ,
    KeyCode::Space, KeyCode::Backspace,
    KeyCode::Menu, KeyCode::CtrlMenu, KeyCode::ShiftMenu, KeyCode::CtrlShiftMenu,
    KeyCode::Char('a'),
    KeyCode::Char('B'),
    KeyCode::Char('t'),
    KeyCode::Char('U'),
    KeyCode::Char(''),
    KeyCode::Char('ø'),
    KeyCode::Char(''),
  ];
  for keycode in keycodes {
    let bs = keycode.bytes();
    let len = bs.len();
    for (i,b) in bs.iter().enumerate() {
      if i == len-1 {
        assert_eq![decoder.write(*b), vec![keycode.clone()]];
      } else {
        assert_eq![decoder.write(*b), vec![], "keycode={:?}", &keycode];
      }
    }
  }
}