use std::fmt::Display;
use serde::{Deserialize, Serialize};
#[derive(
Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize,
)]
#[serde(try_from = "String", into = "String")]
pub enum KeyStrike {
#[default]
None,
Unknown,
Backquote,
Backslash,
BracketLeft,
BracketRight,
Comma,
Digit0,
Digit1,
Digit2,
Digit3,
Digit4,
Digit5,
Digit6,
Digit7,
Digit8,
Digit9,
Equal,
KeyA,
KeyB,
KeyC,
KeyD,
KeyE,
KeyF,
KeyG,
KeyH,
KeyI,
KeyJ,
KeyK,
KeyL,
KeyM,
KeyN,
KeyO,
KeyP,
KeyQ,
KeyR,
KeyS,
KeyT,
KeyU,
KeyV,
KeyW,
KeyX,
KeyY,
KeyZ,
Minus,
Period,
Quote,
Semicolon,
Slash,
Backspace,
Enter,
Space,
Tab,
Delete,
End,
Home,
Insert,
PageDown,
PageUp,
ArrowDown,
ArrowLeft,
ArrowRight,
ArrowUp,
Escape,
PrintScreen,
ScrollLock,
Pause,
F1,
F2,
F3,
F4,
F5,
F6,
F7,
F8,
F9,
F10,
F11,
F12,
F13,
F14,
F15,
F16,
F17,
F18,
F19,
F20,
F21,
F22,
F23,
F24,
F25,
F26,
F27,
F28,
F29,
F30,
F31,
F32,
F33,
F34,
F35,
}
impl Display for KeyStrike {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let text = match self {
KeyStrike::None => "<none>",
KeyStrike::Unknown => "N/A",
KeyStrike::Backquote => "`",
KeyStrike::Backslash => "\\",
KeyStrike::BracketLeft => "[",
KeyStrike::BracketRight => "]",
KeyStrike::Comma => ",",
KeyStrike::Digit0 => "0",
KeyStrike::Digit1 => "1",
KeyStrike::Digit2 => "2",
KeyStrike::Digit3 => "3",
KeyStrike::Digit4 => "4",
KeyStrike::Digit5 => "5",
KeyStrike::Digit6 => "6",
KeyStrike::Digit7 => "7",
KeyStrike::Digit8 => "8",
KeyStrike::Digit9 => "9",
KeyStrike::Equal => "=",
KeyStrike::KeyA => "A",
KeyStrike::KeyB => "B",
KeyStrike::KeyC => "C",
KeyStrike::KeyD => "D",
KeyStrike::KeyE => "E",
KeyStrike::KeyF => "F",
KeyStrike::KeyG => "G",
KeyStrike::KeyH => "H",
KeyStrike::KeyI => "I",
KeyStrike::KeyJ => "J",
KeyStrike::KeyK => "K",
KeyStrike::KeyL => "L",
KeyStrike::KeyM => "M",
KeyStrike::KeyN => "N",
KeyStrike::KeyO => "O",
KeyStrike::KeyP => "P",
KeyStrike::KeyQ => "Q",
KeyStrike::KeyR => "R",
KeyStrike::KeyS => "S",
KeyStrike::KeyT => "T",
KeyStrike::KeyU => "U",
KeyStrike::KeyV => "V",
KeyStrike::KeyW => "W",
KeyStrike::KeyX => "X",
KeyStrike::KeyY => "Y",
KeyStrike::KeyZ => "Z",
KeyStrike::Minus => "-",
KeyStrike::Period => ".",
KeyStrike::Quote => "'",
KeyStrike::Semicolon => ";",
KeyStrike::Slash => "/",
KeyStrike::Backspace => "<Backspace>",
KeyStrike::Enter => "<Enter>",
KeyStrike::Space => "<Space>",
KeyStrike::Tab => "<Tab>",
KeyStrike::Delete => "<Del>",
KeyStrike::End => "<End>",
KeyStrike::Home => "<Home>",
KeyStrike::Insert => "<Insert>",
KeyStrike::PageDown => "<PgDn>",
KeyStrike::PageUp => "<PgUp>",
KeyStrike::ArrowDown => "↓",
KeyStrike::ArrowLeft => "←",
KeyStrike::ArrowRight => "→",
KeyStrike::ArrowUp => "↑",
KeyStrike::Escape => "<Esc>",
KeyStrike::PrintScreen => "<PrintScreen>",
KeyStrike::ScrollLock => "<ScrlLock>",
KeyStrike::Pause => "<Pause>",
KeyStrike::F1 => "<F1>",
KeyStrike::F2 => "F2",
KeyStrike::F3 => "F3",
KeyStrike::F4 => "F4",
KeyStrike::F5 => "F5",
KeyStrike::F6 => "F6",
KeyStrike::F7 => "F7",
KeyStrike::F8 => "F8",
KeyStrike::F9 => "F9",
KeyStrike::F10 => "F10",
KeyStrike::F11 => "F11",
KeyStrike::F12 => "F12",
KeyStrike::F13 => "F13",
KeyStrike::F14 => "F14",
KeyStrike::F15 => "F15",
KeyStrike::F16 => "F16",
KeyStrike::F17 => "F17",
KeyStrike::F18 => "F18",
KeyStrike::F19 => "F19",
KeyStrike::F20 => "F20",
KeyStrike::F21 => "F21",
KeyStrike::F22 => "F22",
KeyStrike::F23 => "F23",
KeyStrike::F24 => "F24",
KeyStrike::F25 => "F25",
KeyStrike::F26 => "F26",
KeyStrike::F27 => "F27",
KeyStrike::F28 => "F28",
KeyStrike::F29 => "F29",
KeyStrike::F30 => "F30",
KeyStrike::F31 => "F31",
KeyStrike::F32 => "F32",
KeyStrike::F33 => "F33",
KeyStrike::F34 => "F34",
KeyStrike::F35 => "F35",
};
write!(f, "{}", text)
}
}
impl TryFrom<String> for KeyStrike {
type Error = String;
fn try_from(value: String) -> Result<Self, Self::Error> {
let value = match value.as_str() {
"a" => KeyStrike::KeyA,
"b" => KeyStrike::KeyB,
"c" => KeyStrike::KeyC,
"d" => KeyStrike::KeyD,
"e" => KeyStrike::KeyE,
"f" => KeyStrike::KeyF,
"g" => KeyStrike::KeyG,
"h" => KeyStrike::KeyH,
"i" => KeyStrike::KeyI,
"j" => KeyStrike::KeyJ,
"k" => KeyStrike::KeyK,
"l" => KeyStrike::KeyL,
"m" => KeyStrike::KeyM,
"n" => KeyStrike::KeyN,
"o" => KeyStrike::KeyO,
"p" => KeyStrike::KeyP,
"q" => KeyStrike::KeyQ,
"r" => KeyStrike::KeyR,
"s" => KeyStrike::KeyS,
"t" => KeyStrike::KeyT,
"u" => KeyStrike::KeyU,
"v" => KeyStrike::KeyV,
"w" => KeyStrike::KeyW,
"x" => KeyStrike::KeyX,
"y" => KeyStrike::KeyY,
"z" => KeyStrike::KeyZ,
"0" => KeyStrike::Digit0,
"1" => KeyStrike::Digit1,
"2" => KeyStrike::Digit2,
"3" => KeyStrike::Digit3,
"4" => KeyStrike::Digit4,
"5" => KeyStrike::Digit5,
"6" => KeyStrike::Digit6,
"7" => KeyStrike::Digit7,
"8" => KeyStrike::Digit8,
"9" => KeyStrike::Digit9,
";" => KeyStrike::Semicolon,
"[" => KeyStrike::BracketLeft,
"]" => KeyStrike::BracketRight,
"{" => KeyStrike::BracketLeft,
"}" => KeyStrike::BracketRight,
"\\" => KeyStrike::Backslash,
"'" => KeyStrike::Quote,
"`" => KeyStrike::Backquote,
"/" => KeyStrike::Slash,
"-" => KeyStrike::Minus,
"=" => KeyStrike::Equal,
"." => KeyStrike::Period,
"," => KeyStrike::Comma,
" " => KeyStrike::Space,
"<Backspace>" => KeyStrike::Backspace,
"<Enter>" => KeyStrike::Enter,
"<Space>" => KeyStrike::Space,
"<Tab>" => KeyStrike::Tab,
"<Del>" => KeyStrike::Delete,
"<End>" => KeyStrike::End,
"<Home>" => KeyStrike::Home,
"<Insert>" => KeyStrike::Insert,
"<PgDn>" => KeyStrike::PageDown,
"<PgUp>" => KeyStrike::PageUp,
"↓" => KeyStrike::ArrowDown,
"←" => KeyStrike::ArrowLeft,
"→" => KeyStrike::ArrowRight,
"↑" => KeyStrike::ArrowUp,
"<Esc>" => KeyStrike::Escape,
"<PrintScreen>" => KeyStrike::PrintScreen,
"<ScrlLock>" => KeyStrike::ScrollLock,
"<Pause>" => KeyStrike::Pause,
"<F1>" => KeyStrike::F1,
"F2" => KeyStrike::F2,
"F3" => KeyStrike::F3,
"F4" => KeyStrike::F4,
"F5" => KeyStrike::F5,
"F6" => KeyStrike::F6,
"F7" => KeyStrike::F7,
"F8" => KeyStrike::F8,
"F9" => KeyStrike::F9,
"F10" => KeyStrike::F10,
"F11" => KeyStrike::F11,
"F12" => KeyStrike::F12,
"F13" => KeyStrike::F13,
"F14" => KeyStrike::F14,
"F15" => KeyStrike::F15,
"F16" => KeyStrike::F16,
"F17" => KeyStrike::F17,
"F18" => KeyStrike::F18,
"F19" => KeyStrike::F19,
"F20" => KeyStrike::F20,
"F21" => KeyStrike::F21,
"F22" => KeyStrike::F22,
"F23" => KeyStrike::F23,
"F24" => KeyStrike::F24,
"F25" => KeyStrike::F25,
"F26" => KeyStrike::F26,
"F27" => KeyStrike::F27,
"F28" => KeyStrike::F28,
"F29" => KeyStrike::F29,
"F30" => KeyStrike::F30,
"F31" => KeyStrike::F31,
"F32" => KeyStrike::F32,
"F33" => KeyStrike::F33,
"F34" => KeyStrike::F34,
"F35" => KeyStrike::F35,
"A" => KeyStrike::KeyA,
"B" => KeyStrike::KeyB,
"C" => KeyStrike::KeyC,
"D" => KeyStrike::KeyD,
"E" => KeyStrike::KeyE,
"F" => KeyStrike::KeyF,
"G" => KeyStrike::KeyG,
"H" => KeyStrike::KeyH,
"I" => KeyStrike::KeyI,
"J" => KeyStrike::KeyJ,
"K" => KeyStrike::KeyK,
"L" => KeyStrike::KeyL,
"M" => KeyStrike::KeyM,
"N" => KeyStrike::KeyN,
"O" => KeyStrike::KeyO,
"P" => KeyStrike::KeyP,
"Q" => KeyStrike::KeyQ,
"R" => KeyStrike::KeyR,
"S" => KeyStrike::KeyS,
"T" => KeyStrike::KeyT,
"U" => KeyStrike::KeyU,
"V" => KeyStrike::KeyV,
"W" => KeyStrike::KeyW,
"X" => KeyStrike::KeyX,
"Y" => KeyStrike::KeyY,
"Z" => KeyStrike::KeyZ,
_ => KeyStrike::Unknown,
};
Ok(value)
}
}
impl From<KeyStrike> for String {
fn from(value: KeyStrike) -> Self {
value.to_string()
}
}