Skip to main content

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