use winit::keyboard::{KeyCode, NamedKey};
pub fn parse_key(text: &str) -> Option<NamedKey> {
let key = match text {
"alt" => NamedKey::Alt,
"altgraph" => NamedKey::AltGraph,
"capslock" => NamedKey::CapsLock,
"control" | "ctrl" => NamedKey::Control,
"fn" => NamedKey::Fn,
"fnlock" => NamedKey::FnLock,
"numlock" => NamedKey::NumLock,
"scrolllock" => NamedKey::ScrollLock,
"shift" => NamedKey::Shift,
"symbol" => NamedKey::Symbol,
"symbollock" => NamedKey::SymbolLock,
"meta" => NamedKey::Meta,
"hyper" => NamedKey::Hyper,
"super" => NamedKey::Super,
"enter" => NamedKey::Enter,
"tab" => NamedKey::Tab,
"space" => NamedKey::Space,
"arrowdown" | "down" => NamedKey::ArrowDown,
"arrowleft" | "left" => NamedKey::ArrowLeft,
"arrowright" | "right" => NamedKey::ArrowRight,
"arrowup" | "up" => NamedKey::ArrowUp,
"end" => NamedKey::End,
"home" => NamedKey::Home,
"pagedown" | "pgdown" => NamedKey::PageDown,
"pageup" | "pgup" => NamedKey::PageUp,
"backspace" => NamedKey::Backspace,
"clear" => NamedKey::Clear,
"copy" => NamedKey::Copy,
"crsel" => NamedKey::CrSel,
"cut" => NamedKey::Cut,
"delete" => NamedKey::Delete,
"eraseeof" => NamedKey::EraseEof,
"exsel" => NamedKey::ExSel,
"insert" => NamedKey::Insert,
"paste" => NamedKey::Paste,
"redo" => NamedKey::Redo,
"undo" => NamedKey::Undo,
"accept" => NamedKey::Accept,
"again" => NamedKey::Again,
"attn" => NamedKey::Attn,
"cancel" => NamedKey::Cancel,
"contextmenu" => NamedKey::ContextMenu,
"escape" => NamedKey::Escape,
"execute" => NamedKey::Execute,
"find" => NamedKey::Find,
"help" => NamedKey::Help,
"pause" => NamedKey::Pause,
"play" => NamedKey::Play,
"props" => NamedKey::Props,
"select" => NamedKey::Select,
"zoomin" => NamedKey::ZoomIn,
"zoomout" => NamedKey::ZoomOut,
"brightnessdown" => NamedKey::BrightnessDown,
"brightnessup" => NamedKey::BrightnessUp,
"eject" => NamedKey::Eject,
"logoff" => NamedKey::LogOff,
"power" => NamedKey::Power,
"poweroff" => NamedKey::PowerOff,
"printscreen" => NamedKey::PrintScreen,
"hibernate" => NamedKey::Hibernate,
"standby" => NamedKey::Standby,
"wakeup" => NamedKey::WakeUp,
"allcandidates" => NamedKey::AllCandidates,
"alphanumeric" => NamedKey::Alphanumeric,
"codeinput" => NamedKey::CodeInput,
"compose" => NamedKey::Compose,
"convert" => NamedKey::Convert,
"finalmode" => NamedKey::FinalMode,
"groupfirst" => NamedKey::GroupFirst,
"grouplast" => NamedKey::GroupLast,
"groupnext" => NamedKey::GroupNext,
"groupprevious" => NamedKey::GroupPrevious,
"modechange" => NamedKey::ModeChange,
"nextcandidate" => NamedKey::NextCandidate,
"nonconvert" => NamedKey::NonConvert,
"previouscandidate" => NamedKey::PreviousCandidate,
"process" => NamedKey::Process,
"singlecandidate" => NamedKey::SingleCandidate,
"hangulmode" => NamedKey::HangulMode,
"hanjamode" => NamedKey::HanjaMode,
"junjamode" => NamedKey::JunjaMode,
"eisu" => NamedKey::Eisu,
"hankaku" => NamedKey::Hankaku,
"hiragana" => NamedKey::Hiragana,
"hiraganakatakana" => NamedKey::HiraganaKatakana,
"kanamode" => NamedKey::KanaMode,
"kanjimode" => NamedKey::KanjiMode,
"katakana" => NamedKey::Katakana,
"romaji" => NamedKey::Romaji,
"zenkaku" => NamedKey::Zenkaku,
"zenkakuhankaku" => NamedKey::ZenkakuHankaku,
"soft1" => NamedKey::Soft1,
"soft2" => NamedKey::Soft2,
"soft3" => NamedKey::Soft3,
"soft4" => NamedKey::Soft4,
"channeldown" => NamedKey::ChannelDown,
"channelup" => NamedKey::ChannelUp,
"close" => NamedKey::Close,
"mailforward" => NamedKey::MailForward,
"mailreply" => NamedKey::MailReply,
"mailsend" => NamedKey::MailSend,
"mediaclose" => NamedKey::MediaClose,
"mediafastforward" => NamedKey::MediaFastForward,
"mediapause" => NamedKey::MediaPause,
"mediaplay" => NamedKey::MediaPlay,
"mediaplaypause" => NamedKey::MediaPlayPause,
"mediarecord" => NamedKey::MediaRecord,
"mediarewind" => NamedKey::MediaRewind,
"mediastop" => NamedKey::MediaStop,
"mediatracknext" => NamedKey::MediaTrackNext,
"mediatrackprevious" => NamedKey::MediaTrackPrevious,
"new" => NamedKey::New,
"open" => NamedKey::Open,
"print" => NamedKey::Print,
"save" => NamedKey::Save,
"spellcheck" => NamedKey::SpellCheck,
"key11" => NamedKey::Key11,
"key12" => NamedKey::Key12,
"audiobalanceleft" => NamedKey::AudioBalanceLeft,
"audiobalanceright" => NamedKey::AudioBalanceRight,
"audiobassboostdown" => NamedKey::AudioBassBoostDown,
"audiobassboosttoggle" => NamedKey::AudioBassBoostToggle,
"audiobassboostup" => NamedKey::AudioBassBoostUp,
"audiofaderfront" => NamedKey::AudioFaderFront,
"audiofaderrear" => NamedKey::AudioFaderRear,
"audiosurroundmodenext" => NamedKey::AudioSurroundModeNext,
"audiotrebledown" => NamedKey::AudioTrebleDown,
"audiotrebleup" => NamedKey::AudioTrebleUp,
"audiovolumedown" => NamedKey::AudioVolumeDown,
"audiovolumeup" => NamedKey::AudioVolumeUp,
"audiovolumemute" => NamedKey::AudioVolumeMute,
"microphonetoggle" => NamedKey::MicrophoneToggle,
"microphonevolumedown" => NamedKey::MicrophoneVolumeDown,
"microphonevolumeup" => NamedKey::MicrophoneVolumeUp,
"microphonevolumemute" => NamedKey::MicrophoneVolumeMute,
"speechcorrectionlist" => NamedKey::SpeechCorrectionList,
"speechinputtoggle" => NamedKey::SpeechInputToggle,
"launchapplication1" => NamedKey::LaunchApplication1,
"launchapplication2" => NamedKey::LaunchApplication2,
"launchcalendar" => NamedKey::LaunchCalendar,
"launchcontacts" => NamedKey::LaunchContacts,
"launchmail" => NamedKey::LaunchMail,
"launchmediaplayer" => NamedKey::LaunchMediaPlayer,
"launchmusicplayer" => NamedKey::LaunchMusicPlayer,
"launchphone" => NamedKey::LaunchPhone,
"launchscreensaver" => NamedKey::LaunchScreenSaver,
"launchspreadsheet" => NamedKey::LaunchSpreadsheet,
"launchwebbrowser" => NamedKey::LaunchWebBrowser,
"launchwebcam" => NamedKey::LaunchWebCam,
"launchwordprocessor" => NamedKey::LaunchWordProcessor,
"browserback" => NamedKey::BrowserBack,
"browserfavorites" => NamedKey::BrowserFavorites,
"browserforward" => NamedKey::BrowserForward,
"browserhome" => NamedKey::BrowserHome,
"browserrefresh" => NamedKey::BrowserRefresh,
"browsersearch" => NamedKey::BrowserSearch,
"browserstop" => NamedKey::BrowserStop,
"appswitch" => NamedKey::AppSwitch,
"call" => NamedKey::Call,
"camera" => NamedKey::Camera,
"camerafocus" => NamedKey::CameraFocus,
"endcall" => NamedKey::EndCall,
"goback" => NamedKey::GoBack,
"gohome" => NamedKey::GoHome,
"headsethook" => NamedKey::HeadsetHook,
"lastnumberredial" => NamedKey::LastNumberRedial,
"notification" => NamedKey::Notification,
"mannermode" => NamedKey::MannerMode,
"voicedial" => NamedKey::VoiceDial,
"tv" => NamedKey::TV,
"tv3dmode" => NamedKey::TV3DMode,
"tvantennacable" => NamedKey::TVAntennaCable,
"tvaudiodescription" => NamedKey::TVAudioDescription,
"tvaudiodescriptionmixdown" => NamedKey::TVAudioDescriptionMixDown,
"tvaudiodescriptionmixup" => NamedKey::TVAudioDescriptionMixUp,
"tvcontentsmenu" => NamedKey::TVContentsMenu,
"tvdataservice" => NamedKey::TVDataService,
"tvinput" => NamedKey::TVInput,
"tvinputcomponent1" => NamedKey::TVInputComponent1,
"tvinputcomponent2" => NamedKey::TVInputComponent2,
"tvinputcomposite1" => NamedKey::TVInputComposite1,
"tvinputcomposite2" => NamedKey::TVInputComposite2,
"tvinputhdmi1" => NamedKey::TVInputHDMI1,
"tvinputhdmi2" => NamedKey::TVInputHDMI2,
"tvinputhdmi3" => NamedKey::TVInputHDMI3,
"tvinputhdmi4" => NamedKey::TVInputHDMI4,
"tvinputvga1" => NamedKey::TVInputVGA1,
"tvmediacontext" => NamedKey::TVMediaContext,
"tvnetwork" => NamedKey::TVNetwork,
"tvnumberentry" => NamedKey::TVNumberEntry,
"tvpower" => NamedKey::TVPower,
"tvradioservice" => NamedKey::TVRadioService,
"tvsatellite" => NamedKey::TVSatellite,
"tvsatellitebs" => NamedKey::TVSatelliteBS,
"tvsatellitecs" => NamedKey::TVSatelliteCS,
"tvsatellitetoggle" => NamedKey::TVSatelliteToggle,
"tvterrestrialanalog" => NamedKey::TVTerrestrialAnalog,
"tvterrestrialdigital" => NamedKey::TVTerrestrialDigital,
"tvtimer" => NamedKey::TVTimer,
"avrinput" => NamedKey::AVRInput,
"avrpower" => NamedKey::AVRPower,
"colorf0red" => NamedKey::ColorF0Red,
"colorf1green" => NamedKey::ColorF1Green,
"colorf2yellow" => NamedKey::ColorF2Yellow,
"colorf3blue" => NamedKey::ColorF3Blue,
"colorf4grey" => NamedKey::ColorF4Grey,
"colorf5brown" => NamedKey::ColorF5Brown,
"closedcaptiontoggle" => NamedKey::ClosedCaptionToggle,
"dimmer" => NamedKey::Dimmer,
"displayswap" => NamedKey::DisplaySwap,
"dvr" => NamedKey::DVR,
"exit" => NamedKey::Exit,
"favoriteclear0" => NamedKey::FavoriteClear0,
"favoriteclear1" => NamedKey::FavoriteClear1,
"favoriteclear2" => NamedKey::FavoriteClear2,
"favoriteclear3" => NamedKey::FavoriteClear3,
"favoriterecall0" => NamedKey::FavoriteRecall0,
"favoriterecall1" => NamedKey::FavoriteRecall1,
"favoriterecall2" => NamedKey::FavoriteRecall2,
"favoriterecall3" => NamedKey::FavoriteRecall3,
"favoritestore0" => NamedKey::FavoriteStore0,
"favoritestore1" => NamedKey::FavoriteStore1,
"favoritestore2" => NamedKey::FavoriteStore2,
"favoritestore3" => NamedKey::FavoriteStore3,
"guide" => NamedKey::Guide,
"guidenextday" => NamedKey::GuideNextDay,
"guidepreviousday" => NamedKey::GuidePreviousDay,
"info" => NamedKey::Info,
"instantreplay" => NamedKey::InstantReplay,
"link" => NamedKey::Link,
"listprogram" => NamedKey::ListProgram,
"livecontent" => NamedKey::LiveContent,
"lock" => NamedKey::Lock,
"mediaapps" => NamedKey::MediaApps,
"mediaaudiotrack" => NamedKey::MediaAudioTrack,
"medialast" => NamedKey::MediaLast,
"mediaskipbackward" => NamedKey::MediaSkipBackward,
"mediaskipforward" => NamedKey::MediaSkipForward,
"mediastepbackward" => NamedKey::MediaStepBackward,
"mediastepforward" => NamedKey::MediaStepForward,
"mediatopmenu" => NamedKey::MediaTopMenu,
"navigatein" => NamedKey::NavigateIn,
"navigatenext" => NamedKey::NavigateNext,
"navigateout" => NamedKey::NavigateOut,
"navigateprevious" => NamedKey::NavigatePrevious,
"nextfavoritechannel" => NamedKey::NextFavoriteChannel,
"nextuserprofile" => NamedKey::NextUserProfile,
"ondemand" => NamedKey::OnDemand,
"pairing" => NamedKey::Pairing,
"pinpdown" => NamedKey::PinPDown,
"pinpmove" => NamedKey::PinPMove,
"pinptoggle" => NamedKey::PinPToggle,
"pinpup" => NamedKey::PinPUp,
"playspeeddown" => NamedKey::PlaySpeedDown,
"playspeedreset" => NamedKey::PlaySpeedReset,
"playspeedup" => NamedKey::PlaySpeedUp,
"randomtoggle" => NamedKey::RandomToggle,
"rclowbattery" => NamedKey::RcLowBattery,
"recordspeednext" => NamedKey::RecordSpeedNext,
"rfbypass" => NamedKey::RfBypass,
"scanchannelstoggle" => NamedKey::ScanChannelsToggle,
"screenmodenext" => NamedKey::ScreenModeNext,
"settings" => NamedKey::Settings,
"splitscreentoggle" => NamedKey::SplitScreenToggle,
"stbinput" => NamedKey::STBInput,
"stbpower" => NamedKey::STBPower,
"subtitle" => NamedKey::Subtitle,
"teletext" => NamedKey::Teletext,
"videomodenext" => NamedKey::VideoModeNext,
"wink" => NamedKey::Wink,
"zoomtoggle" => NamedKey::ZoomToggle,
"f1" => NamedKey::F1,
"f2" => NamedKey::F2,
"f3" => NamedKey::F3,
"f4" => NamedKey::F4,
"f5" => NamedKey::F5,
"f6" => NamedKey::F6,
"f7" => NamedKey::F7,
"f8" => NamedKey::F8,
"f9" => NamedKey::F9,
"f10" => NamedKey::F10,
"f11" => NamedKey::F11,
"f12" => NamedKey::F12,
"f13" => NamedKey::F13,
"f14" => NamedKey::F14,
"f15" => NamedKey::F15,
"f16" => NamedKey::F16,
"f17" => NamedKey::F17,
"f18" => NamedKey::F18,
"f19" => NamedKey::F19,
"f20" => NamedKey::F20,
"f21" => NamedKey::F21,
"f22" => NamedKey::F22,
"f23" => NamedKey::F23,
"f24" => NamedKey::F24,
"f25" => NamedKey::F25,
"f26" => NamedKey::F26,
"f27" => NamedKey::F27,
"f28" => NamedKey::F28,
"f29" => NamedKey::F29,
"f30" => NamedKey::F30,
"f31" => NamedKey::F31,
"f32" => NamedKey::F32,
"f33" => NamedKey::F33,
"f34" => NamedKey::F34,
"f35" => NamedKey::F35,
_ => return None,
};
Some(key)
}
pub fn parse_keycode(text: &str) -> Option<KeyCode> {
let key = match text {
"backquote" | "`" => KeyCode::Backquote,
"backslash" | r"\" => KeyCode::Backslash,
"bracketleft" | "[" => KeyCode::BracketLeft,
"bracketright" | "]" => KeyCode::BracketRight,
"comma" | "," => KeyCode::Comma,
"0" => KeyCode::Digit0,
"1" => KeyCode::Digit1,
"2" => KeyCode::Digit2,
"3" => KeyCode::Digit3,
"4" => KeyCode::Digit4,
"5" => KeyCode::Digit5,
"6" => KeyCode::Digit6,
"7" => KeyCode::Digit7,
"8" => KeyCode::Digit8,
"9" => KeyCode::Digit9,
"equal" | "=" => KeyCode::Equal,
"intlbackslash" => KeyCode::IntlBackslash,
"intlro" => KeyCode::IntlRo,
"intlyen" => KeyCode::IntlYen,
"a" => KeyCode::KeyA,
"b" => KeyCode::KeyB,
"c" => KeyCode::KeyC,
"d" => KeyCode::KeyD,
"e" => KeyCode::KeyE,
"f" => KeyCode::KeyF,
"g" => KeyCode::KeyG,
"h" => KeyCode::KeyH,
"i" => KeyCode::KeyI,
"j" => KeyCode::KeyJ,
"k" => KeyCode::KeyK,
"l" => KeyCode::KeyL,
"m" => KeyCode::KeyM,
"n" => KeyCode::KeyN,
"o" => KeyCode::KeyO,
"p" => KeyCode::KeyP,
"q" => KeyCode::KeyQ,
"r" => KeyCode::KeyR,
"s" => KeyCode::KeyS,
"t" => KeyCode::KeyT,
"u" => KeyCode::KeyU,
"v" => KeyCode::KeyV,
"w" => KeyCode::KeyW,
"x" => KeyCode::KeyX,
"y" => KeyCode::KeyY,
"z" => KeyCode::KeyZ,
"minus" | "-" => KeyCode::Minus,
"period" | "." => KeyCode::Period,
"quote" | "'" => KeyCode::Quote,
"semicolon" | ";" => KeyCode::Semicolon,
"slash" | "/" => KeyCode::Slash,
"altleft" => KeyCode::AltLeft,
"altright" => KeyCode::AltRight,
"backspace" => KeyCode::Backspace,
"capslock" => KeyCode::CapsLock,
"contextmenu" => KeyCode::ContextMenu,
"controlleft" => KeyCode::ControlLeft,
"controlright" => KeyCode::ControlRight,
"enter" => KeyCode::Enter,
"superleft" => KeyCode::SuperLeft,
"superright" => KeyCode::SuperRight,
"shiftleft" => KeyCode::ShiftLeft,
"shiftright" => KeyCode::ShiftRight,
"space" => KeyCode::Space,
"tab" => KeyCode::Tab,
"convert" => KeyCode::Convert,
"kanamode" => KeyCode::KanaMode,
"lang1" => KeyCode::Lang1,
"lang2" => KeyCode::Lang2,
"lang3" => KeyCode::Lang3,
"lang4" => KeyCode::Lang4,
"lang5" => KeyCode::Lang5,
"nonconvert" => KeyCode::NonConvert,
"delete" => KeyCode::Delete,
"end" => KeyCode::End,
"help" => KeyCode::Help,
"home" => KeyCode::Home,
"insert" => KeyCode::Insert,
"pagedown" | "pgdown" => KeyCode::PageDown,
"pageup" | "pgup" => KeyCode::PageUp,
"arrowdown" | "down" => KeyCode::ArrowDown,
"arrowleft" | "left" => KeyCode::ArrowLeft,
"arrowright" | "right" => KeyCode::ArrowRight,
"arrowup" | "up" => KeyCode::ArrowUp,
"numlock" => KeyCode::NumLock,
"numpad0" => KeyCode::Numpad0,
"numpad1" => KeyCode::Numpad1,
"numpad2" => KeyCode::Numpad2,
"numpad3" => KeyCode::Numpad3,
"numpad4" => KeyCode::Numpad4,
"numpad5" => KeyCode::Numpad5,
"numpad6" => KeyCode::Numpad6,
"numpad7" => KeyCode::Numpad7,
"numpad8" => KeyCode::Numpad8,
"numpad9" => KeyCode::Numpad9,
"numpadadd" => KeyCode::NumpadAdd,
"numpadbackspace" => KeyCode::NumpadBackspace,
"numpadclear" => KeyCode::NumpadClear,
"numpadclearentry" => KeyCode::NumpadClearEntry,
"numpadcomma" => KeyCode::NumpadComma,
"numpaddecimal" => KeyCode::NumpadDecimal,
"numpaddivide" => KeyCode::NumpadDivide,
"numpadenter" => KeyCode::NumpadEnter,
"numpadequal" => KeyCode::NumpadEqual,
"numpadhash" => KeyCode::NumpadHash,
"numpadmemoryadd" => KeyCode::NumpadMemoryAdd,
"numpadmemoryclear" => KeyCode::NumpadMemoryClear,
"numpadmemoryrecall" => KeyCode::NumpadMemoryRecall,
"numpadmemorystore" => KeyCode::NumpadMemoryStore,
"numpadmemorysubtract" => KeyCode::NumpadMemorySubtract,
"numpadmultiply" => KeyCode::NumpadMultiply,
"numpadparenleft" => KeyCode::NumpadParenLeft,
"numpadparenright" => KeyCode::NumpadParenRight,
"numpadstar" => KeyCode::NumpadStar,
"numpadsubtract" => KeyCode::NumpadSubtract,
"escape" => KeyCode::Escape,
"fn" => KeyCode::Fn,
"fnlock" => KeyCode::FnLock,
"printscreen" => KeyCode::PrintScreen,
"scrolllock" => KeyCode::ScrollLock,
"pause" => KeyCode::Pause,
"browserback" => KeyCode::BrowserBack,
"browserfavorites" => KeyCode::BrowserFavorites,
"browserforward" => KeyCode::BrowserForward,
"browserhome" => KeyCode::BrowserHome,
"browserrefresh" => KeyCode::BrowserRefresh,
"browsersearch" => KeyCode::BrowserSearch,
"browserstop" => KeyCode::BrowserStop,
"eject" => KeyCode::Eject,
"launchapp1" => KeyCode::LaunchApp1,
"launchapp2" => KeyCode::LaunchApp2,
"launchmail" => KeyCode::LaunchMail,
"mediaplaypause" => KeyCode::MediaPlayPause,
"mediaselect" => KeyCode::MediaSelect,
"mediastop" => KeyCode::MediaStop,
"mediatracknext" => KeyCode::MediaTrackNext,
"mediatrackprevious" => KeyCode::MediaTrackPrevious,
"power" => KeyCode::Power,
"sleep" => KeyCode::Sleep,
"audiovolumedown" => KeyCode::AudioVolumeDown,
"audiovolumemute" => KeyCode::AudioVolumeMute,
"audiovolumeup" => KeyCode::AudioVolumeUp,
"wakeup" => KeyCode::WakeUp,
"meta" => KeyCode::Meta,
"hyper" => KeyCode::Hyper,
"turbo" => KeyCode::Turbo,
"abort" => KeyCode::Abort,
"resume" => KeyCode::Resume,
"suspend" => KeyCode::Suspend,
"again" => KeyCode::Again,
"copy" => KeyCode::Copy,
"cut" => KeyCode::Cut,
"find" => KeyCode::Find,
"open" => KeyCode::Open,
"paste" => KeyCode::Paste,
"props" => KeyCode::Props,
"select" => KeyCode::Select,
"undo" => KeyCode::Undo,
"hiragana" => KeyCode::Hiragana,
"katakana" => KeyCode::Katakana,
"f1" => KeyCode::F1,
"f2" => KeyCode::F2,
"f3" => KeyCode::F3,
"f4" => KeyCode::F4,
"f5" => KeyCode::F5,
"f6" => KeyCode::F6,
"f7" => KeyCode::F7,
"f8" => KeyCode::F8,
"f9" => KeyCode::F9,
"f10" => KeyCode::F10,
"f11" => KeyCode::F11,
"f12" => KeyCode::F12,
"f13" => KeyCode::F13,
"f14" => KeyCode::F14,
"f15" => KeyCode::F15,
"f16" => KeyCode::F16,
"f17" => KeyCode::F17,
"f18" => KeyCode::F18,
"f19" => KeyCode::F19,
"f20" => KeyCode::F20,
"f21" => KeyCode::F21,
"f22" => KeyCode::F22,
"f23" => KeyCode::F23,
"f24" => KeyCode::F24,
"f25" => KeyCode::F25,
"f26" => KeyCode::F26,
"f27" => KeyCode::F27,
"f28" => KeyCode::F28,
"f29" => KeyCode::F29,
"f30" => KeyCode::F30,
"f31" => KeyCode::F31,
"f32" => KeyCode::F32,
"f33" => KeyCode::F33,
"f34" => KeyCode::F34,
"f35" => KeyCode::F35,
_ => return None,
};
Some(key)
}
#[test]
fn parse_shortcut() {
use crate::shortcut::{KeyCombination, Modifiers, ShortcutKey};
fn test(text: &str, modifiers: Modifiers, key: impl Into<ShortcutKey>, equality: bool) {
let actual = KeyCombination::from_str_portable(text).unwrap();
let expected = KeyCombination::new(modifiers, key);
if equality {
assert_eq!(
actual, expected,
"parse({:?}): expected {:?}, got {:?}",
text, expected, actual
);
} else {
assert_ne!(
actual, expected,
"parse({:?}) for nonequality: expected {:?}, got {:?}",
text, expected, actual
);
}
}
fn test_eq(text: &str, modifiers: Modifiers, key: impl Into<ShortcutKey>) {
test(text, modifiers, key, true);
}
test_eq("PageDown", Modifiers::empty(), NamedKey::PageDown);
test_eq("Left", Modifiers::empty(), NamedKey::ArrowLeft);
test_eq("Ctrl+Left", Modifiers::CTRL_OR_MAC_CMD, NamedKey::ArrowLeft);
test_eq(
"Shift+Ctrl+Left",
Modifiers::SHIFT | Modifiers::CTRL_OR_MAC_CMD,
NamedKey::ArrowLeft,
);
test_eq("Ctrl+X", Modifiers::CTRL_OR_MAC_CMD, KeyCode::KeyX);
test_eq("Ctrl+ X", Modifiers::CTRL_OR_MAC_CMD, KeyCode::KeyX);
test_eq("Ctrl + X", Modifiers::CTRL_OR_MAC_CMD, KeyCode::KeyX);
test_eq(" Ctrl+X", Modifiers::CTRL_OR_MAC_CMD, KeyCode::KeyX);
test_eq(" Ctrl + X ", Modifiers::CTRL_OR_MAC_CMD, KeyCode::KeyX);
fn test_ne(text: &str, modifiers: Modifiers, key: impl Into<ShortcutKey>) {
test(text, modifiers, key, false);
}
test_ne(
"Ctrl+Left",
Modifiers::META_OR_MAC_CTRL,
NamedKey::ArrowLeft,
);
test_ne("PageDown", Modifiers::empty(), NamedKey::PageUp);
fn test_for_err(text: &str, err: &str) {
let error = KeyCombination::from_str_portable(text).err().unwrap();
assert_eq!(
&error.to_string(),
err,
"parse({:?}): expected error {:?}, got {:?}",
text,
err,
error
);
}
test_for_err("", "unknown key");
test_for_err("+Shift", "invalid format");
test_for_err("Alt++Shift", "invalid format");
test_for_err("Blabla+Shift", "unknown modifier");
test_for_err("Shift+Anotherblabla", "unknown key");
}