Hagia
log in
morj / wzmach
overview
files
history
wiki
Viewing at
use serde::Deserialize;
use uinput::event::keyboard::{Key, KeyPad, Keyboard, Misc};

/// Keyboard key with instances for deserialization
#[derive(PartialEq, Debug)]
pub struct ConfigKey(pub Keyboard);

impl<'de> Deserialize<'de> for ConfigKey {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
deserializer.deserialize_str(KeyVisitor)
}
}

struct KeyVisitor;
impl<'de> serde::de::Visitor<'de> for KeyVisitor {
type Value = ConfigKey;

fn expecting(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(fmt, "Expecting Key string")
}

fn visit_str<E: serde::de::Error>(self, data: &str) -> Result<ConfigKey, E> {
static VARIANTS: &[&str] = &[&"KEY"];
match KEYS_TABLE.get(data) {
Some(k) => Ok(ConfigKey(*k)),
None => Err(E::unknown_variant(data, VARIANTS)),
}
}
}

// copy-pasted from uinput sources
const KEYS_TABLE: phf::Map<&'static str, Keyboard> = phf::phf_map! {
// classic keys
"Esc" => Keyboard::Key(Key::Esc),
"1" => Keyboard::Key(Key::_1),
"2" => Keyboard::Key(Key::_2),
"3" => Keyboard::Key(Key::_3),
"4" => Keyboard::Key(Key::_4),
"5" => Keyboard::Key(Key::_5),
"6" => Keyboard::Key(Key::_6),
"7" => Keyboard::Key(Key::_7),
"8" => Keyboard::Key(Key::_8),
"9" => Keyboard::Key(Key::_9),
"0" => Keyboard::Key(Key::_0),
"Minus" => Keyboard::Key(Key::Minus),
"Equal" => Keyboard::Key(Key::Equal),
"BackSpace" => Keyboard::Key(Key::BackSpace),
"Tab" => Keyboard::Key(Key::Tab),
"Q" => Keyboard::Key(Key::Q),
"W" => Keyboard::Key(Key::W),
"E" => Keyboard::Key(Key::E),
"R" => Keyboard::Key(Key::R),
"T" => Keyboard::Key(Key::T),
"Y" => Keyboard::Key(Key::Y),
"U" => Keyboard::Key(Key::U),
"I" => Keyboard::Key(Key::I),
"O" => Keyboard::Key(Key::O),
"P" => Keyboard::Key(Key::P),
"LeftBrace" => Keyboard::Key(Key::LeftBrace),
"RightBrace" => Keyboard::Key(Key::RightBrace),
"Enter" => Keyboard::Key(Key::Enter),
"LeftControl" => Keyboard::Key(Key::LeftControl),
"A" => Keyboard::Key(Key::A),
"S" => Keyboard::Key(Key::S),
"D" => Keyboard::Key(Key::D),
"F" => Keyboard::Key(Key::F),
"G" => Keyboard::Key(Key::G),
"H" => Keyboard::Key(Key::H),
"J" => Keyboard::Key(Key::J),
"K" => Keyboard::Key(Key::K),
"L" => Keyboard::Key(Key::L),
"SemiColon" => Keyboard::Key(Key::SemiColon),
"Apostrophe" => Keyboard::Key(Key::Apostrophe),
"Grave" => Keyboard::Key(Key::Grave),
"LeftShift" => Keyboard::Key(Key::LeftShift),
"BackSlash" => Keyboard::Key(Key::BackSlash),
"Z" => Keyboard::Key(Key::Z),
"X" => Keyboard::Key(Key::X),
"C" => Keyboard::Key(Key::C),
"V" => Keyboard::Key(Key::V),
"B" => Keyboard::Key(Key::B),
"N" => Keyboard::Key(Key::N),
"M" => Keyboard::Key(Key::M),
"Comma" => Keyboard::Key(Key::Comma),
"Dot" => Keyboard::Key(Key::Dot),
"Slash" => Keyboard::Key(Key::Slash),
"RightShift" => Keyboard::Key(Key::RightShift),
"LeftAlt" => Keyboard::Key(Key::LeftAlt),
"Space" => Keyboard::Key(Key::Space),
"CapsLock" => Keyboard::Key(Key::CapsLock),
"F1" => Keyboard::Key(Key::F1),
"F2" => Keyboard::Key(Key::F2),
"F3" => Keyboard::Key(Key::F3),
"F4" => Keyboard::Key(Key::F4),
"F5" => Keyboard::Key(Key::F5),
"F6" => Keyboard::Key(Key::F6),
"F7" => Keyboard::Key(Key::F7),
"F8" => Keyboard::Key(Key::F8),
"F9" => Keyboard::Key(Key::F9),
"F10" => Keyboard::Key(Key::F10),
"NumLock" => Keyboard::Key(Key::NumLock),
"ScrollLock" => Keyboard::Key(Key::ScrollLock),
"F11" => Keyboard::Key(Key::F11),
"F12" => Keyboard::Key(Key::F12),
"RightControl" => Keyboard::Key(Key::RightControl),
"SysRq" => Keyboard::Key(Key::SysRq),
"RightAlt" => Keyboard::Key(Key::RightAlt),
"LineFeed" => Keyboard::Key(Key::LineFeed),
"Home" => Keyboard::Key(Key::Home),
"Up" => Keyboard::Key(Key::Up),
"PageUp" => Keyboard::Key(Key::PageUp),
"Left" => Keyboard::Key(Key::Left),
"Right" => Keyboard::Key(Key::Right),
"End" => Keyboard::Key(Key::End),
"Down" => Keyboard::Key(Key::Down),
"PageDown" => Keyboard::Key(Key::PageDown),
"Insert" => Keyboard::Key(Key::Insert),
"Delete" => Keyboard::Key(Key::Delete),
"LeftMeta" => Keyboard::Key(Key::LeftMeta),
"RightMeta" => Keyboard::Key(Key::RightMeta),
"ScrollUp" => Keyboard::Key(Key::ScrollUp),
"ScrollDown" => Keyboard::Key(Key::ScrollDown),
"F13" => Keyboard::Key(Key::F13),
"F14" => Keyboard::Key(Key::F14),
"F15" => Keyboard::Key(Key::F15),
"F16" => Keyboard::Key(Key::F16),
"F17" => Keyboard::Key(Key::F17),
"F18" => Keyboard::Key(Key::F18),
"F19" => Keyboard::Key(Key::F19),
"F20" => Keyboard::Key(Key::F20),
"F21" => Keyboard::Key(Key::F21),
"F22" => Keyboard::Key(Key::F22),
"F23" => Keyboard::Key(Key::F23),
"F24" => Keyboard::Key(Key::F24),
// Keypad
"Keypad_Asterisk" => Keyboard::KeyPad(KeyPad::Asterisk),
"Keypad_7" => Keyboard::KeyPad(KeyPad::_7),
"Keypad_8" => Keyboard::KeyPad(KeyPad::_8),
"Keypad_9" => Keyboard::KeyPad(KeyPad::_9),
"Keypad_Minus" => Keyboard::KeyPad(KeyPad::Minus),
"Keypad_4" => Keyboard::KeyPad(KeyPad::_4),
"Keypad_5" => Keyboard::KeyPad(KeyPad::_5),
"Keypad_6" => Keyboard::KeyPad(KeyPad::_6),
"Keypad_Plus" => Keyboard::KeyPad(KeyPad::Plus),
"Keypad_1" => Keyboard::KeyPad(KeyPad::_1),
"Keypad_2" => Keyboard::KeyPad(KeyPad::_2),
"Keypad_3" => Keyboard::KeyPad(KeyPad::_3),
"Keypad_0" => Keyboard::KeyPad(KeyPad::_0),
"Keypad_Dot" => Keyboard::KeyPad(KeyPad::Dot),
"Keypad_AltComma" => Keyboard::KeyPad(KeyPad::AltComma),
"Keypad_Enter" => Keyboard::KeyPad(KeyPad::Enter),
"Keypad_Slash" => Keyboard::KeyPad(KeyPad::Slash),
"Keypad_Equal" => Keyboard::KeyPad(KeyPad::Equal),
"Keypad_PlusMinus" => Keyboard::KeyPad(KeyPad::PlusMinus),
"Keypad_Comma" => Keyboard::KeyPad(KeyPad::Comma),
"Keypad_LeftParen" => Keyboard::KeyPad(KeyPad::LeftParen),
"Keypad_RightParen" => Keyboard::KeyPad(KeyPad::RightParen),
// Miscellaneous
"ZenkakuHankaku" => Keyboard::Misc(Misc::ZenkakuHankaku),
"ND102" => Keyboard::Misc(Misc::ND102),
"RO" => Keyboard::Misc(Misc::RO),
"Katakana" => Keyboard::Misc(Misc::Katakana),
"Hiragana" => Keyboard::Misc(Misc::Hiragana),
"Henkan" => Keyboard::Misc(Misc::Henkan),
"KatakanaHiragana" => Keyboard::Misc(Misc::KatakanaHiragana),
"Muhenkan" => Keyboard::Misc(Misc::Muhenkan),
"Macro" => Keyboard::Misc(Misc::Macro),
"Mute" => Keyboard::Misc(Misc::Mute),
"VolumeDown" => Keyboard::Misc(Misc::VolumeDown),
"VolumeUp" => Keyboard::Misc(Misc::VolumeUp),
"Power" => Keyboard::Misc(Misc::Power),
"Pause" => Keyboard::Misc(Misc::Pause),
"Scale" => Keyboard::Misc(Misc::Scale),
"Hangeul" => Keyboard::Misc(Misc::Hangeul),
"Hanguel" => Keyboard::Misc(Misc::Hanguel),
"Hanja" => Keyboard::Misc(Misc::Hanja),
"Yen" => Keyboard::Misc(Misc::Yen),
"Compose" => Keyboard::Misc(Misc::Compose),
"Stop" => Keyboard::Misc(Misc::Stop),
"Again" => Keyboard::Misc(Misc::Again),
"Props" => Keyboard::Misc(Misc::Props),
"Undo" => Keyboard::Misc(Misc::Undo),
"Front" => Keyboard::Misc(Misc::Front),
"Copy" => Keyboard::Misc(Misc::Copy),
"Open" => Keyboard::Misc(Misc::Open),
"Paste" => Keyboard::Misc(Misc::Paste),
"Find" => Keyboard::Misc(Misc::Find),
"Cut" => Keyboard::Misc(Misc::Cut),
"Help" => Keyboard::Misc(Misc::Help),
"Menu" => Keyboard::Misc(Misc::Menu),
"Calc" => Keyboard::Misc(Misc::Calc),
"Setup" => Keyboard::Misc(Misc::Setup),
"Sleep" => Keyboard::Misc(Misc::Sleep),
"WakeUp" => Keyboard::Misc(Misc::WakeUp),
"File" => Keyboard::Misc(Misc::File),
"SendFile" => Keyboard::Misc(Misc::SendFile),
"DeleteFile" => Keyboard::Misc(Misc::DeleteFile),
"XFer" => Keyboard::Misc(Misc::XFer),
"Prog1" => Keyboard::Misc(Misc::Prog1),
"Prog2" => Keyboard::Misc(Misc::Prog2),
"WWW" => Keyboard::Misc(Misc::WWW),
"MSDOS" => Keyboard::Misc(Misc::MSDOS),
"Coffee" => Keyboard::Misc(Misc::Coffee),
"ScreenLock" => Keyboard::Misc(Misc::ScreenLock),
"RotateDisplay" => Keyboard::Misc(Misc::RotateDisplay),
"Direction" => Keyboard::Misc(Misc::Direction),
"CycleWindows" => Keyboard::Misc(Misc::CycleWindows),
"Mail" => Keyboard::Misc(Misc::Mail),
"Bookmarks" => Keyboard::Misc(Misc::Bookmarks),
"Computer" => Keyboard::Misc(Misc::Computer),
"Back" => Keyboard::Misc(Misc::Back),
"Forward" => Keyboard::Misc(Misc::Forward),
"CloseCD" => Keyboard::Misc(Misc::CloseCD),
"EjectCD" => Keyboard::Misc(Misc::EjectCD),
"EjectCloseCD" => Keyboard::Misc(Misc::EjectCloseCD),
"NextSong" => Keyboard::Misc(Misc::NextSong),
"PlayPause" => Keyboard::Misc(Misc::PlayPause),
"PreviousSong" => Keyboard::Misc(Misc::PreviousSong),
"StopCD" => Keyboard::Misc(Misc::StopCD),
"Record" => Keyboard::Misc(Misc::Record),
"Rewind" => Keyboard::Misc(Misc::Rewind),
"Phone" => Keyboard::Misc(Misc::Phone),
"Iso" => Keyboard::Misc(Misc::Iso),
"Config" => Keyboard::Misc(Misc::Config),
"HomePage" => Keyboard::Misc(Misc::HomePage),
"Refresh" => Keyboard::Misc(Misc::Refresh),
"Exit" => Keyboard::Misc(Misc::Exit),
"Move" => Keyboard::Misc(Misc::Move),
"Edit" => Keyboard::Misc(Misc::Edit),
"New" => Keyboard::Misc(Misc::New),
"Redo" => Keyboard::Misc(Misc::Redo),
"PlayCD" => Keyboard::Misc(Misc::PlayCD),
"PauseCD" => Keyboard::Misc(Misc::PauseCD),
"Prog3" => Keyboard::Misc(Misc::Prog3),
"Prog4" => Keyboard::Misc(Misc::Prog4),
"DashBoard" => Keyboard::Misc(Misc::DashBoard),
"Suspend" => Keyboard::Misc(Misc::Suspend),
"Close" => Keyboard::Misc(Misc::Close),
"Play" => Keyboard::Misc(Misc::Play),
"FastForward" => Keyboard::Misc(Misc::FastForward),
"BassBoost" => Keyboard::Misc(Misc::BassBoost),
"Print" => Keyboard::Misc(Misc::Print),
"HP" => Keyboard::Misc(Misc::HP),
"Camera" => Keyboard::Misc(Misc::Camera),
"Sound" => Keyboard::Misc(Misc::Sound),
"Question" => Keyboard::Misc(Misc::Question),
"Email" => Keyboard::Misc(Misc::Email),
"Chat" => Keyboard::Misc(Misc::Chat),
"Search" => Keyboard::Misc(Misc::Search),
"Connect" => Keyboard::Misc(Misc::Connect),
"Finance" => Keyboard::Misc(Misc::Finance),
"Sport" => Keyboard::Misc(Misc::Sport),
"Shop" => Keyboard::Misc(Misc::Shop),
"AltErase" => Keyboard::Misc(Misc::AltErase),
"Cancel" => Keyboard::Misc(Misc::Cancel),
"BrightnessDown" => Keyboard::Misc(Misc::BrightnessDown),
"BrightnessUp" => Keyboard::Misc(Misc::BrightnessUp),
"Media" => Keyboard::Misc(Misc::Media),
"SwitchVideoMode" => Keyboard::Misc(Misc::SwitchVideoMode),
"IllumToggle" => Keyboard::Misc(Misc::IllumToggle),
"IllumDown" => Keyboard::Misc(Misc::IllumDown),
"IllumUp" => Keyboard::Misc(Misc::IllumUp),
"Send" => Keyboard::Misc(Misc::Send),
"Reply" => Keyboard::Misc(Misc::Reply),
"ForwardEmail" => Keyboard::Misc(Misc::ForwardEmail),
"Save" => Keyboard::Misc(Misc::Save),
"Documents" => Keyboard::Misc(Misc::Documents),
"Battery" => Keyboard::Misc(Misc::Battery),
"Bluetooth" => Keyboard::Misc(Misc::Bluetooth),
"WLAN" => Keyboard::Misc(Misc::WLAN),
"UWB" => Keyboard::Misc(Misc::UWB),
"Unknown" => Keyboard::Misc(Misc::Unknown),
"VideoNext" => Keyboard::Misc(Misc::VideoNext),
"VideoPrev" => Keyboard::Misc(Misc::VideoPrev),
"BrightnessCycle" => Keyboard::Misc(Misc::BrightnessCycle),
"BrightnessAuto" => Keyboard::Misc(Misc::BrightnessAuto),
"BrightnessZero" => Keyboard::Misc(Misc::BrightnessZero),
"DisplayOff" => Keyboard::Misc(Misc::DisplayOff),
"WWAN" => Keyboard::Misc(Misc::WWAN),
"WIMAX" => Keyboard::Misc(Misc::WIMAX),
"RFKILL" => Keyboard::Misc(Misc::RFKILL),
"MicMute" => Keyboard::Misc(Misc::MicMute),
"Ok" => Keyboard::Misc(Misc::Ok),
"Select" => Keyboard::Misc(Misc::Select),
"Goto" => Keyboard::Misc(Misc::Goto),
"Clear" => Keyboard::Misc(Misc::Clear),
"Power2" => Keyboard::Misc(Misc::Power2),
"Option" => Keyboard::Misc(Misc::Option),
"Info" => Keyboard::Misc(Misc::Info),
"Time" => Keyboard::Misc(Misc::Time),
"Vendor" => Keyboard::Misc(Misc::Vendor),
"Archive" => Keyboard::Misc(Misc::Archive),
"Program" => Keyboard::Misc(Misc::Program),
"Channel" => Keyboard::Misc(Misc::Channel),
"Favorites" => Keyboard::Misc(Misc::Favorites),
"EPG" => Keyboard::Misc(Misc::EPG),
"PVR" => Keyboard::Misc(Misc::PVR),
"MHP" => Keyboard::Misc(Misc::MHP),
"Language" => Keyboard::Misc(Misc::Language),
"Title" => Keyboard::Misc(Misc::Title),
"Subtitle" => Keyboard::Misc(Misc::Subtitle),
"Angle" => Keyboard::Misc(Misc::Angle),
"Zoom" => Keyboard::Misc(Misc::Zoom),
"Mode" => Keyboard::Misc(Misc::Mode),
"Keyboard" => Keyboard::Misc(Misc::Keyboard),
"Screen" => Keyboard::Misc(Misc::Screen),
"PC" => Keyboard::Misc(Misc::PC),
"TV" => Keyboard::Misc(Misc::TV),
"TV2" => Keyboard::Misc(Misc::TV2),
"VCR" => Keyboard::Misc(Misc::VCR),
"VCR2" => Keyboard::Misc(Misc::VCR2),
"SAT" => Keyboard::Misc(Misc::SAT),
"SAT2" => Keyboard::Misc(Misc::SAT2),
"CD" => Keyboard::Misc(Misc::CD),
"Tape" => Keyboard::Misc(Misc::Tape),
"Radio" => Keyboard::Misc(Misc::Radio),
"Tuner" => Keyboard::Misc(Misc::Tuner),
"Player" => Keyboard::Misc(Misc::Player),
"Text" => Keyboard::Misc(Misc::Text),
"DVD" => Keyboard::Misc(Misc::DVD),
"AUX" => Keyboard::Misc(Misc::AUX),
"MP3" => Keyboard::Misc(Misc::MP3),
"Audio" => Keyboard::Misc(Misc::Audio),
"Video" => Keyboard::Misc(Misc::Video),
"Directory" => Keyboard::Misc(Misc::Directory),
"List" => Keyboard::Misc(Misc::List),
"Memo" => Keyboard::Misc(Misc::Memo),
"Calendar" => Keyboard::Misc(Misc::Calendar),
"Red" => Keyboard::Misc(Misc::Red),
"Green" => Keyboard::Misc(Misc::Green),
"Yellow" => Keyboard::Misc(Misc::Yellow),
"Blue" => Keyboard::Misc(Misc::Blue),
"ChannelUp" => Keyboard::Misc(Misc::ChannelUp),
"ChannelDown" => Keyboard::Misc(Misc::ChannelDown),
"First" => Keyboard::Misc(Misc::First),
"Last" => Keyboard::Misc(Misc::Last),
"AB" => Keyboard::Misc(Misc::AB),
"Next" => Keyboard::Misc(Misc::Next),
"Restart" => Keyboard::Misc(Misc::Restart),
"Slow" => Keyboard::Misc(Misc::Slow),
"Shuffle" => Keyboard::Misc(Misc::Shuffle),
"Break" => Keyboard::Misc(Misc::Break),
"Previous" => Keyboard::Misc(Misc::Previous),
"Digits" => Keyboard::Misc(Misc::Digits),
"TEEN" => Keyboard::Misc(Misc::TEEN),
"TWEN" => Keyboard::Misc(Misc::TWEN),
"VideoPhone" => Keyboard::Misc(Misc::VideoPhone),
"Games" => Keyboard::Misc(Misc::Games),
"ZoomIn" => Keyboard::Misc(Misc::ZoomIn),
"ZoomOut" => Keyboard::Misc(Misc::ZoomOut),
"ZoomReset" => Keyboard::Misc(Misc::ZoomReset),
"WordProcessor" => Keyboard::Misc(Misc::WordProcessor),
"Editor" => Keyboard::Misc(Misc::Editor),
"SpreadSheet" => Keyboard::Misc(Misc::SpreadSheet),
"GraphicsEditor" => Keyboard::Misc(Misc::GraphicsEditor),
"Presentation" => Keyboard::Misc(Misc::Presentation),
"Database" => Keyboard::Misc(Misc::Database),
"News" => Keyboard::Misc(Misc::News),
"VoiceMail" => Keyboard::Misc(Misc::VoiceMail),
"AddressBook" => Keyboard::Misc(Misc::AddressBook),
"Messenger" => Keyboard::Misc(Misc::Messenger),
"DisplayToggle" => Keyboard::Misc(Misc::DisplayToggle),
"BrightnessToggle" => Keyboard::Misc(Misc::BrightnessToggle),
"SpellCheck" => Keyboard::Misc(Misc::SpellCheck),
"LogOff" => Keyboard::Misc(Misc::LogOff),
"Dollar" => Keyboard::Misc(Misc::Dollar),
"Euro" => Keyboard::Misc(Misc::Euro),
"FrameBack" => Keyboard::Misc(Misc::FrameBack),
"FrameForward" => Keyboard::Misc(Misc::FrameForward),
"ContextMenu" => Keyboard::Misc(Misc::ContextMenu),
"MediaRepeat" => Keyboard::Misc(Misc::MediaRepeat),
"Up10Channels" => Keyboard::Misc(Misc::Up10Channels),
"Down10Channels" => Keyboard::Misc(Misc::Down10Channels),
"Images" => Keyboard::Misc(Misc::Images),
"DeleteEOL" => Keyboard::Misc(Misc::DeleteEOL),
"DeleteEOS" => Keyboard::Misc(Misc::DeleteEOS),
"InsertLine" => Keyboard::Misc(Misc::InsertLine),
"DeleteLine" => Keyboard::Misc(Misc::DeleteLine),
"WPS" => Keyboard::Misc(Misc::WPS),
"LightsToggle" => Keyboard::Misc(Misc::LightsToggle),
"ALSToggle" => Keyboard::Misc(Misc::ALSToggle),
"ButtonConfig" => Keyboard::Misc(Misc::ButtonConfig),
"TaskManager" => Keyboard::Misc(Misc::TaskManager),
"Journal" => Keyboard::Misc(Misc::Journal),
"ControlPanel" => Keyboard::Misc(Misc::ControlPanel),
"AppSelect" => Keyboard::Misc(Misc::AppSelect),
"ScreenSaver" => Keyboard::Misc(Misc::ScreenSaver),
"VoiceCommand" => Keyboard::Misc(Misc::VoiceCommand),
"BrighnessMin" => Keyboard::Misc(Misc::BrighnessMin),
"BrightnessMax" => Keyboard::Misc(Misc::BrightnessMax),
};