summaryrefslogtreecommitdiffstats
path: root/ui/src/types/keys.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ui/src/types/keys.rs')
-rw-r--r--ui/src/types/keys.rs45
1 files changed, 45 insertions, 0 deletions
diff --git a/ui/src/types/keys.rs b/ui/src/types/keys.rs
index 335e856e..6be97782 100644
--- a/ui/src/types/keys.rs
+++ b/ui/src/types/keys.rs
@@ -19,6 +19,7 @@
* along with meli. If not, see <http://www.gnu.org/licenses/>.
*/
+use super::*;
use chan;
use std::fmt;
use std::io;
@@ -199,3 +200,47 @@ derive_csi_sequence!("End Bracketed Paste Mode", BracketModeEnd, "?2003l");
pub const BRACKET_PASTE_START: &[u8] = b"\x1B[200~";
pub const BRACKET_PASTE_END: &[u8] = b"\x1B[201~";
+
+const FIELDS: &'static [&'static str] = &[];
+
+
+impl<'de> Deserialize<'de> for Key {
+ fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
+ where
+ D: Deserializer<'de>,
+ {
+ struct KeyVisitor;
+
+ impl<'de> Visitor<'de> for KeyVisitor {
+ type Value = Key;
+
+ fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+ formatter.write_str("`secs` or `nanos`")
+ }
+
+ fn visit_str<E>(self, value: &str) -> Result<Key, E>
+ where
+ E: de::Error,
+ {
+ match value {
+ "Backspace" => Ok(Key::Backspace),
+ "Left" => Ok(Key::Left),
+ "Right" => Ok(Key::Right),
+ "Up" => Ok(Key::Up),
+ "Down" => Ok(Key::Down),
+ "Home" => Ok(Key::Home),
+ "End" => Ok(Key::End),
+ "PageUp" => Ok(Key::PageUp),
+ "PageDown" => Ok(Key::PageDown),
+ "Delete" => Ok(Key::Delete),
+ "Insert" => Ok(Key::Insert),
+ "Esc" => Ok(Key::Esc),
+ ref s if s.len() == 1 => Ok(Key::Char(s.chars().nth(0).unwrap())),
+ _ => Err(de::Error::unknown_field(value, FIELDS)),
+ }
+ }
+ }
+
+ deserializer.deserialize_identifier(KeyVisitor)
+ }
+}