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}