zellij_utils/plugin_api/
key.rs

1pub use super::generated_api::api::key::{
2    key::{
3        KeyModifier as ProtobufKeyModifier, MainKey as ProtobufMainKey,
4        NamedKey as ProtobufNamedKey,
5    },
6    Key as ProtobufKey,
7};
8use crate::data::{BareKey, KeyModifier, KeyWithModifier};
9
10use std::collections::BTreeSet;
11use std::convert::TryFrom;
12
13impl TryFrom<ProtobufMainKey> for BareKey {
14    type Error = &'static str;
15    fn try_from(protobuf_main_key: ProtobufMainKey) -> Result<Self, &'static str> {
16        match protobuf_main_key {
17            ProtobufMainKey::Char(character) => Ok(BareKey::Char(char_index_to_char(character))),
18            ProtobufMainKey::Key(key_index) => {
19                let key = ProtobufNamedKey::from_i32(key_index).ok_or("invalid_key")?;
20                Ok(named_key_to_bare_key(key))
21            },
22        }
23    }
24}
25
26impl TryFrom<BareKey> for ProtobufMainKey {
27    type Error = &'static str;
28    fn try_from(bare_key: BareKey) -> Result<Self, &'static str> {
29        match bare_key {
30            BareKey::PageDown => Ok(ProtobufMainKey::Key(ProtobufNamedKey::PageDown as i32)),
31            BareKey::PageUp => Ok(ProtobufMainKey::Key(ProtobufNamedKey::PageUp as i32)),
32            BareKey::Left => Ok(ProtobufMainKey::Key(ProtobufNamedKey::LeftArrow as i32)),
33            BareKey::Down => Ok(ProtobufMainKey::Key(ProtobufNamedKey::DownArrow as i32)),
34            BareKey::Up => Ok(ProtobufMainKey::Key(ProtobufNamedKey::UpArrow as i32)),
35            BareKey::Right => Ok(ProtobufMainKey::Key(ProtobufNamedKey::RightArrow as i32)),
36            BareKey::Home => Ok(ProtobufMainKey::Key(ProtobufNamedKey::Home as i32)),
37            BareKey::End => Ok(ProtobufMainKey::Key(ProtobufNamedKey::End as i32)),
38            BareKey::Backspace => Ok(ProtobufMainKey::Key(ProtobufNamedKey::Backspace as i32)),
39            BareKey::Delete => Ok(ProtobufMainKey::Key(ProtobufNamedKey::Delete as i32)),
40            BareKey::Insert => Ok(ProtobufMainKey::Key(ProtobufNamedKey::Insert as i32)),
41            BareKey::F(f_index) => fn_index_to_main_key(f_index),
42            BareKey::Char(character) => Ok(ProtobufMainKey::Char(character as i32)),
43            BareKey::Tab => Ok(ProtobufMainKey::Key(ProtobufNamedKey::Tab as i32)),
44            BareKey::Esc => Ok(ProtobufMainKey::Key(ProtobufNamedKey::Esc as i32)),
45            BareKey::Enter => Ok(ProtobufMainKey::Key(ProtobufNamedKey::Enter as i32)),
46            BareKey::CapsLock => Ok(ProtobufMainKey::Key(ProtobufNamedKey::CapsLock as i32)),
47            BareKey::ScrollLock => Ok(ProtobufMainKey::Key(ProtobufNamedKey::ScrollLock as i32)),
48            BareKey::NumLock => Ok(ProtobufMainKey::Key(ProtobufNamedKey::NumLock as i32)),
49            BareKey::PrintScreen => Ok(ProtobufMainKey::Key(ProtobufNamedKey::PrintScreen as i32)),
50            BareKey::Pause => Ok(ProtobufMainKey::Key(ProtobufNamedKey::Pause as i32)),
51            BareKey::Menu => Ok(ProtobufMainKey::Key(ProtobufNamedKey::Menu as i32)),
52        }
53    }
54}
55
56impl TryFrom<ProtobufKeyModifier> for KeyModifier {
57    type Error = &'static str;
58    fn try_from(protobuf_key_modifier: ProtobufKeyModifier) -> Result<Self, &'static str> {
59        match protobuf_key_modifier {
60            ProtobufKeyModifier::Ctrl => Ok(KeyModifier::Ctrl),
61            ProtobufKeyModifier::Alt => Ok(KeyModifier::Alt),
62            ProtobufKeyModifier::Shift => Ok(KeyModifier::Shift),
63            ProtobufKeyModifier::Super => Ok(KeyModifier::Super),
64        }
65    }
66}
67
68impl TryFrom<KeyModifier> for ProtobufKeyModifier {
69    type Error = &'static str;
70    fn try_from(key_modifier: KeyModifier) -> Result<Self, &'static str> {
71        match key_modifier {
72            KeyModifier::Ctrl => Ok(ProtobufKeyModifier::Ctrl),
73            KeyModifier::Alt => Ok(ProtobufKeyModifier::Alt),
74            KeyModifier::Shift => Ok(ProtobufKeyModifier::Shift),
75            KeyModifier::Super => Ok(ProtobufKeyModifier::Super),
76        }
77    }
78}
79
80impl TryFrom<ProtobufKey> for KeyWithModifier {
81    type Error = &'static str;
82    fn try_from(protobuf_key: ProtobufKey) -> Result<Self, &'static str> {
83        let bare_key = protobuf_key
84            .main_key
85            .ok_or("Key must have main_key")?
86            .try_into()?;
87        let mut key_modifiers = BTreeSet::new();
88        if let Some(main_modifier) = protobuf_key.modifier {
89            key_modifiers.insert(
90                ProtobufKeyModifier::from_i32(main_modifier)
91                    .ok_or("invalid key modifier")?
92                    .try_into()?,
93            );
94        }
95        for key_modifier in protobuf_key.additional_modifiers {
96            key_modifiers.insert(
97                ProtobufKeyModifier::from_i32(key_modifier)
98                    .ok_or("invalid key modifier")?
99                    .try_into()?,
100            );
101        }
102        Ok(KeyWithModifier {
103            bare_key,
104            key_modifiers,
105        })
106    }
107}
108
109impl TryFrom<KeyWithModifier> for ProtobufKey {
110    type Error = &'static str;
111    fn try_from(key_with_modifier: KeyWithModifier) -> Result<Self, &'static str> {
112        let mut modifiers: Vec<ProtobufKeyModifier> = vec![];
113        for key_modifier in key_with_modifier.key_modifiers {
114            modifiers.push(key_modifier.try_into()?);
115        }
116
117        Ok(ProtobufKey {
118            main_key: Some(key_with_modifier.bare_key.try_into()?),
119            modifier: modifiers.pop().map(|m| m as i32),
120            additional_modifiers: modifiers.into_iter().map(|m| m as i32).collect(),
121        })
122    }
123}
124
125fn fn_index_to_main_key(index: u8) -> Result<ProtobufMainKey, &'static str> {
126    match index {
127        1 => Ok(ProtobufMainKey::Key(ProtobufNamedKey::F1 as i32)),
128        2 => Ok(ProtobufMainKey::Key(ProtobufNamedKey::F2 as i32)),
129        3 => Ok(ProtobufMainKey::Key(ProtobufNamedKey::F3 as i32)),
130        4 => Ok(ProtobufMainKey::Key(ProtobufNamedKey::F4 as i32)),
131        5 => Ok(ProtobufMainKey::Key(ProtobufNamedKey::F5 as i32)),
132        6 => Ok(ProtobufMainKey::Key(ProtobufNamedKey::F6 as i32)),
133        7 => Ok(ProtobufMainKey::Key(ProtobufNamedKey::F7 as i32)),
134        8 => Ok(ProtobufMainKey::Key(ProtobufNamedKey::F8 as i32)),
135        9 => Ok(ProtobufMainKey::Key(ProtobufNamedKey::F9 as i32)),
136        10 => Ok(ProtobufMainKey::Key(ProtobufNamedKey::F10 as i32)),
137        11 => Ok(ProtobufMainKey::Key(ProtobufNamedKey::F11 as i32)),
138        12 => Ok(ProtobufMainKey::Key(ProtobufNamedKey::F12 as i32)),
139        _ => Err("Invalid key"),
140    }
141}
142
143fn char_index_to_char(char_index: i32) -> char {
144    char_index as u8 as char
145}
146
147fn named_key_to_bare_key(named_key: ProtobufNamedKey) -> BareKey {
148    match named_key {
149        ProtobufNamedKey::PageDown => BareKey::PageDown,
150        ProtobufNamedKey::PageUp => BareKey::PageUp,
151        ProtobufNamedKey::LeftArrow => BareKey::Left,
152        ProtobufNamedKey::DownArrow => BareKey::Down,
153        ProtobufNamedKey::UpArrow => BareKey::Up,
154        ProtobufNamedKey::RightArrow => BareKey::Right,
155        ProtobufNamedKey::Home => BareKey::Home,
156        ProtobufNamedKey::End => BareKey::End,
157        ProtobufNamedKey::Backspace => BareKey::Backspace,
158        ProtobufNamedKey::Delete => BareKey::Delete,
159        ProtobufNamedKey::Insert => BareKey::Insert,
160        ProtobufNamedKey::F1 => BareKey::F(1),
161        ProtobufNamedKey::F2 => BareKey::F(2),
162        ProtobufNamedKey::F3 => BareKey::F(3),
163        ProtobufNamedKey::F4 => BareKey::F(4),
164        ProtobufNamedKey::F5 => BareKey::F(5),
165        ProtobufNamedKey::F6 => BareKey::F(6),
166        ProtobufNamedKey::F7 => BareKey::F(7),
167        ProtobufNamedKey::F8 => BareKey::F(8),
168        ProtobufNamedKey::F9 => BareKey::F(9),
169        ProtobufNamedKey::F10 => BareKey::F(10),
170        ProtobufNamedKey::F11 => BareKey::F(11),
171        ProtobufNamedKey::F12 => BareKey::F(12),
172        ProtobufNamedKey::Tab => BareKey::Tab,
173        ProtobufNamedKey::Esc => BareKey::Esc,
174        ProtobufNamedKey::CapsLock => BareKey::CapsLock,
175        ProtobufNamedKey::ScrollLock => BareKey::ScrollLock,
176        ProtobufNamedKey::PrintScreen => BareKey::PrintScreen,
177        ProtobufNamedKey::Pause => BareKey::Pause,
178        ProtobufNamedKey::Menu => BareKey::Menu,
179        ProtobufNamedKey::NumLock => BareKey::NumLock,
180        ProtobufNamedKey::Enter => BareKey::Enter,
181    }
182}