summaryrefslogtreecommitdiff
path: root/src/config/keymap/event_from_string.rs
blob: 00179c57d9e83cec6e2920a4ea0d3ed12ba38d32 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
use ratatui::crossterm::event::{KeyCode, KeyEvent, KeyModifiers};

fn parse_key_names(s: &str) -> Option<KeyCode> {
    if s.chars().count() == 1 {
        return Some(KeyCode::Char(s.chars().next().unwrap()));
    }

    match s {
        "esc" => Some(KeyCode::Esc),
        "up" => Some(KeyCode::Up),
        "down" => Some(KeyCode::Down),
        "left" => Some(KeyCode::Left),
        "right" => Some(KeyCode::Right),
        "backspace" => Some(KeyCode::Backspace),
        "enter" => Some(KeyCode::Enter),
        "home" => Some(KeyCode::Home),
        "end" => Some(KeyCode::End),
        "pageup" => Some(KeyCode::PageUp),
        "pagedown" => Some(KeyCode::PageDown),
        "tab" => Some(KeyCode::Tab),
        "delete" => Some(KeyCode::Delete),
        "insert" => Some(KeyCode::Insert),
        "f1" => Some(KeyCode::F(1)),
        "f2" => Some(KeyCode::F(2)),
        "f3" => Some(KeyCode::F(3)),
        "f4" => Some(KeyCode::F(4)),
        "f5" => Some(KeyCode::F(5)),
        "f6" => Some(KeyCode::F(6)),
        "f7" => Some(KeyCode::F(7)),
        "f8" => Some(KeyCode::F(8)),
        "f9" => Some(KeyCode::F(9)),
        "f10" => Some(KeyCode::F(10)),
        "f11" => Some(KeyCode::F(11)),
        "f12" => Some(KeyCode::F(12)),
        "capslock" => Some(KeyCode::CapsLock),
        "scrolllock" => Some(KeyCode::ScrollLock),
        "numlock" => Some(KeyCode::NumLock),
        "printscreen" => Some(KeyCode::PrintScreen),
        "pause" => Some(KeyCode::Pause),
        "menu" => Some(KeyCode::Menu),
        "keypadbegin" => Some(KeyCode::KeypadBegin),
        _ => None
    }
}

pub fn event_from_string(s: String) -> Result<KeyEvent, String> {
    let mut modifiers = KeyModifiers::NONE;
    let s = s.to_lowercase();

    let code = if s.chars().count() == 1 {
        KeyCode::Char(s.chars().next().unwrap())
    } else if s.starts_with('<') && s.ends_with('>') {
        let mut inner = &s[1..s.len() - 1];

        loop {
            if inner.starts_with("c-") {
                inner = &inner[2..];
                modifiers |= KeyModifiers::CONTROL;
            } else if inner.starts_with("a-") {
                inner = &inner[2..];
                modifiers |= KeyModifiers::ALT;
            } else {
                break;
            }
        }

        match parse_key_names(inner) {
            Some(keycode) => keycode,
            None => return Err(format!("{:?} is not a valid keyname", inner))
        }
    } else {
        return Err(format!("{:?} is not a valid keyname", s));
    };

    println!("{:?}", KeyEvent::new(code, modifiers));

    Ok(KeyEvent::new(code, modifiers))
}