use serde::{Deserialize, Serialize};
use crate::bindings::{KeyCode, KeyEvent, KeyModifier};
#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize, Hash)]
pub struct KeyEventBetterSerde {
#[serde(flatten)]
pub code: KeyCodeBetterSerde,
pub modifier: KeyModifier,
}
#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize, Hash)]
#[serde(tag = "type")]
pub enum KeyCodeBetterSerde {
#[serde(rename = "backspace")]
Backspace,
#[serde(rename = "left")]
Left,
#[serde(rename = "right")]
Right,
#[serde(rename = "up")]
Up,
#[serde(rename = "down")]
Down,
#[serde(rename = "home")]
Home,
#[serde(rename = "end")]
End,
#[serde(rename = "pageup")]
PageUp,
#[serde(rename = "pagedown")]
PageDown,
#[serde(rename = "backtab")]
BackTab,
#[serde(rename = "delete")]
Delete,
#[serde(rename = "insert")]
Insert,
#[serde(rename = "f")]
F { value: u8 },
#[serde(rename = "char")]
Char { value: char },
#[serde(rename = "null")]
Null,
#[serde(rename = "esc")]
Esc,
}
impl From<KeyEventBetterSerde> for KeyEvent {
fn from(value: KeyEventBetterSerde) -> Self {
Self {
code: value.code.into(),
modifier: value.modifier,
}
}
}
impl From<KeyCodeBetterSerde> for KeyCode {
fn from(value: KeyCodeBetterSerde) -> Self {
match value {
KeyCodeBetterSerde::Backspace => Self::Backspace,
KeyCodeBetterSerde::Left => Self::Left,
KeyCodeBetterSerde::Right => Self::Right,
KeyCodeBetterSerde::Up => Self::Up,
KeyCodeBetterSerde::Down => Self::Down,
KeyCodeBetterSerde::Home => Self::Home,
KeyCodeBetterSerde::End => Self::End,
KeyCodeBetterSerde::PageUp => Self::PageUp,
KeyCodeBetterSerde::PageDown => Self::PageDown,
KeyCodeBetterSerde::BackTab => Self::BackTab,
KeyCodeBetterSerde::Delete => Self::Delete,
KeyCodeBetterSerde::Insert => Self::Insert,
KeyCodeBetterSerde::F { value } => Self::F(value),
KeyCodeBetterSerde::Char { value } => Self::Char(value),
KeyCodeBetterSerde::Null => Self::Null,
KeyCodeBetterSerde::Esc => Self::Esc,
}
}
}
impl From<KeyEvent> for KeyEventBetterSerde {
fn from(value: KeyEvent) -> Self {
Self {
code: value.code.into(),
modifier: value.modifier,
}
}
}
impl From<KeyCode> for KeyCodeBetterSerde {
fn from(value: KeyCode) -> Self {
match value {
KeyCode::Backspace => Self::Backspace,
KeyCode::Left => Self::Left,
KeyCode::Right => Self::Right,
KeyCode::Up => Self::Up,
KeyCode::Down => Self::Down,
KeyCode::Home => Self::Home,
KeyCode::End => Self::End,
KeyCode::PageUp => Self::PageUp,
KeyCode::PageDown => Self::PageDown,
KeyCode::BackTab => Self::BackTab,
KeyCode::Delete => Self::Delete,
KeyCode::Insert => Self::Insert,
KeyCode::F(value) => Self::F { value },
KeyCode::Char(value) => Self::Char { value },
KeyCode::Null => Self::Null,
KeyCode::Esc => Self::Esc,
}
}
}