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}