1
2#![cfg_attr(rustfmt, rustfmt_skip)]
4#![allow(clippy::doc_markdown)]
5#![allow(deprecated)]
6
7use core::fmt::{self, Display};
8use core::str::FromStr;
9#[cfg(not(feature = "std"))]
10use core::error::Error;
11#[cfg(feature = "std")]
12use std::error::Error;
13
14#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, PartialOrd, Ord)]
23#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24#[non_exhaustive]
25pub enum Code {
26    #[doc(alias = "Backtick")]
29    #[doc(alias = "Grave")]
30    Backquote,
31    Backslash,
36    BracketLeft,
38    BracketRight,
40    Comma,
42    Digit0,
44    Digit1,
46    Digit2,
48    Digit3,
50    Digit4,
52    Digit5,
54    Digit6,
56    Digit7,
58    Digit8,
60    Digit9,
62    Equal,
64    IntlBackslash,
67    IntlRo,
70    IntlYen,
74    KeyA,
77    KeyB,
79    KeyC,
81    KeyD,
83    KeyE,
85    KeyF,
87    KeyG,
89    KeyH,
91    KeyI,
93    KeyJ,
95    KeyK,
97    KeyL,
99    KeyM,
101    KeyN,
103    KeyO,
105    KeyP,
107    KeyQ,
110    KeyR,
112    KeyS,
114    KeyT,
116    KeyU,
118    KeyV,
120    KeyW,
123    KeyX,
125    KeyY,
128    KeyZ,
132    Minus,
134    Period,
136    #[doc(alias = "Apostrophe")]
139    Quote,
140    Semicolon,
142    Slash,
144    AltLeft,
146    AltRight,
149    Backspace,
152    CapsLock,
154    ContextMenu,
156    ControlLeft,
158    ControlRight,
160    #[doc(alias = "Return")]
162    Enter,
163    #[doc(alias = "SuperLeft")]
166    #[doc(alias = "OSLeft")]
167    MetaLeft,
168    #[doc(alias = "SuperRight")]
171    #[doc(alias = "OSRight")]
172    MetaRight,
173    ShiftLeft,
175    ShiftRight,
177    Space,
179    Tab,
181    Convert,
183    KanaMode,
185    Lang1,
187    Lang2,
189    Lang3,
191    Lang4,
193    Lang5,
195    NonConvert,
197    Delete,
201    End,
203    Help,
205    Home,
207    Insert,
209    PageDown,
211    PageUp,
213    ArrowDown,
215    ArrowLeft,
217    ArrowRight,
219    ArrowUp,
221    NumLock,
223    Numpad0,
225    Numpad1,
228    Numpad2,
230    Numpad3,
232    Numpad4,
234    Numpad5,
236    Numpad6,
238    Numpad7,
241    Numpad8,
243    Numpad9,
246    NumpadAdd,
248    NumpadBackspace,
250    NumpadClear,
253    NumpadClearEntry,
255    NumpadComma,
258    NumpadDecimal,
261    NumpadDivide,
263    NumpadEnter,
264    NumpadEqual,
266    NumpadHash,
269    NumpadMemoryAdd,
271    NumpadMemoryClear,
273    NumpadMemoryRecall,
275    NumpadMemoryStore,
277    NumpadMemorySubtract,
279    NumpadMultiply,
282    NumpadParenLeft,
284    NumpadParenRight,
286    NumpadStar,
291    NumpadSubtract,
293    Escape,
295    Fn,
299    FnLock,
302    PrintScreen,
304    ScrollLock,
306    Pause,
308    BrowserBack,
310    BrowserFavorites,
311    BrowserForward,
313    BrowserHome,
314    BrowserRefresh,
315    BrowserSearch,
316    BrowserStop,
317    Eject,
320    LaunchApp1,
322    LaunchApp2,
324    LaunchMail,
325    MediaPlayPause,
326    #[doc(alias = "LaunchMediaPlayer")]
327    MediaSelect,
328    MediaStop,
329    MediaTrackNext,
330    MediaTrackPrevious,
331    Power,
334    Sleep,
335    #[doc(alias = "VolumeDown")]
336    AudioVolumeDown,
337    #[doc(alias = "VolumeMute")]
338    AudioVolumeMute,
339    #[doc(alias = "VolumeUp")]
340    AudioVolumeUp,
341    WakeUp,
342    #[deprecated = "marked as legacy in the spec, use Meta instead"]
343    Hyper,
344    #[deprecated = "marked as legacy in the spec, use Meta instead"]
345    Super,
346    #[deprecated = "marked as legacy in the spec, use Meta instead"]
347    Turbo,
348    Abort,
349    Resume,
350    Suspend,
351    Again,
353    Copy,
355    Cut,
357    Find,
359    Open,
361    Paste,
363    Props,
365    Select,
367    Undo,
369    Hiragana,
371    Katakana,
373    Unidentified,
376    F1,
378    F2,
380    F3,
382    F4,
384    F5,
386    F6,
388    F7,
390    F8,
392    F9,
394    F10,
396    F11,
398    F12,
400    F13,
402    F14,
404    F15,
406    F16,
408    F17,
410    F18,
412    F19,
414    F20,
416    F21,
418    F22,
420    F23,
422    F24,
424    F25,
426    F26,
428    F27,
430    F28,
432    F29,
434    F30,
436    F31,
438    F32,
440    F33,
442    F34,
444    F35,
446    BrightnessDown,
448    BrightnessUp,
450    DisplayToggleIntExt,
452    KeyboardLayoutSelect,
454    LaunchAssistant,
456    LaunchControlPanel,
458    LaunchScreenSaver,
460    MailForward,
462    MailReply,
464    MailSend,
466    MediaFastForward,
468    MediaPause,
470    MediaPlay,
472    MediaRecord,
474    MediaRewind,
476    MicrophoneMuteToggle,
478    PrivacyScreenToggle,
480    KeyboardBacklightToggle,
482    SelectTask,
484    ShowAllWindows,
486    ZoomToggle,
488}
489
490
491impl Display for Code {
492    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
493        use self::Code::*;
494        match *self {
495            Backquote => f.write_str("Backquote"),
496            Backslash => f.write_str("Backslash"),
497            BracketLeft => f.write_str("BracketLeft"),
498            BracketRight => f.write_str("BracketRight"),
499            Comma => f.write_str("Comma"),
500            Digit0 => f.write_str("Digit0"),
501            Digit1 => f.write_str("Digit1"),
502            Digit2 => f.write_str("Digit2"),
503            Digit3 => f.write_str("Digit3"),
504            Digit4 => f.write_str("Digit4"),
505            Digit5 => f.write_str("Digit5"),
506            Digit6 => f.write_str("Digit6"),
507            Digit7 => f.write_str("Digit7"),
508            Digit8 => f.write_str("Digit8"),
509            Digit9 => f.write_str("Digit9"),
510            Equal => f.write_str("Equal"),
511            IntlBackslash => f.write_str("IntlBackslash"),
512            IntlRo => f.write_str("IntlRo"),
513            IntlYen => f.write_str("IntlYen"),
514            KeyA => f.write_str("KeyA"),
515            KeyB => f.write_str("KeyB"),
516            KeyC => f.write_str("KeyC"),
517            KeyD => f.write_str("KeyD"),
518            KeyE => f.write_str("KeyE"),
519            KeyF => f.write_str("KeyF"),
520            KeyG => f.write_str("KeyG"),
521            KeyH => f.write_str("KeyH"),
522            KeyI => f.write_str("KeyI"),
523            KeyJ => f.write_str("KeyJ"),
524            KeyK => f.write_str("KeyK"),
525            KeyL => f.write_str("KeyL"),
526            KeyM => f.write_str("KeyM"),
527            KeyN => f.write_str("KeyN"),
528            KeyO => f.write_str("KeyO"),
529            KeyP => f.write_str("KeyP"),
530            KeyQ => f.write_str("KeyQ"),
531            KeyR => f.write_str("KeyR"),
532            KeyS => f.write_str("KeyS"),
533            KeyT => f.write_str("KeyT"),
534            KeyU => f.write_str("KeyU"),
535            KeyV => f.write_str("KeyV"),
536            KeyW => f.write_str("KeyW"),
537            KeyX => f.write_str("KeyX"),
538            KeyY => f.write_str("KeyY"),
539            KeyZ => f.write_str("KeyZ"),
540            Minus => f.write_str("Minus"),
541            Period => f.write_str("Period"),
542            Quote => f.write_str("Quote"),
543            Semicolon => f.write_str("Semicolon"),
544            Slash => f.write_str("Slash"),
545            AltLeft => f.write_str("AltLeft"),
546            AltRight => f.write_str("AltRight"),
547            Backspace => f.write_str("Backspace"),
548            CapsLock => f.write_str("CapsLock"),
549            ContextMenu => f.write_str("ContextMenu"),
550            ControlLeft => f.write_str("ControlLeft"),
551            ControlRight => f.write_str("ControlRight"),
552            Enter => f.write_str("Enter"),
553            MetaLeft => f.write_str("MetaLeft"),
554            MetaRight => f.write_str("MetaRight"),
555            ShiftLeft => f.write_str("ShiftLeft"),
556            ShiftRight => f.write_str("ShiftRight"),
557            Space => f.write_str("Space"),
558            Tab => f.write_str("Tab"),
559            Convert => f.write_str("Convert"),
560            KanaMode => f.write_str("KanaMode"),
561            Lang1 => f.write_str("Lang1"),
562            Lang2 => f.write_str("Lang2"),
563            Lang3 => f.write_str("Lang3"),
564            Lang4 => f.write_str("Lang4"),
565            Lang5 => f.write_str("Lang5"),
566            NonConvert => f.write_str("NonConvert"),
567            Delete => f.write_str("Delete"),
568            End => f.write_str("End"),
569            Help => f.write_str("Help"),
570            Home => f.write_str("Home"),
571            Insert => f.write_str("Insert"),
572            PageDown => f.write_str("PageDown"),
573            PageUp => f.write_str("PageUp"),
574            ArrowDown => f.write_str("ArrowDown"),
575            ArrowLeft => f.write_str("ArrowLeft"),
576            ArrowRight => f.write_str("ArrowRight"),
577            ArrowUp => f.write_str("ArrowUp"),
578            NumLock => f.write_str("NumLock"),
579            Numpad0 => f.write_str("Numpad0"),
580            Numpad1 => f.write_str("Numpad1"),
581            Numpad2 => f.write_str("Numpad2"),
582            Numpad3 => f.write_str("Numpad3"),
583            Numpad4 => f.write_str("Numpad4"),
584            Numpad5 => f.write_str("Numpad5"),
585            Numpad6 => f.write_str("Numpad6"),
586            Numpad7 => f.write_str("Numpad7"),
587            Numpad8 => f.write_str("Numpad8"),
588            Numpad9 => f.write_str("Numpad9"),
589            NumpadAdd => f.write_str("NumpadAdd"),
590            NumpadBackspace => f.write_str("NumpadBackspace"),
591            NumpadClear => f.write_str("NumpadClear"),
592            NumpadClearEntry => f.write_str("NumpadClearEntry"),
593            NumpadComma => f.write_str("NumpadComma"),
594            NumpadDecimal => f.write_str("NumpadDecimal"),
595            NumpadDivide => f.write_str("NumpadDivide"),
596            NumpadEnter => f.write_str("NumpadEnter"),
597            NumpadEqual => f.write_str("NumpadEqual"),
598            NumpadHash => f.write_str("NumpadHash"),
599            NumpadMemoryAdd => f.write_str("NumpadMemoryAdd"),
600            NumpadMemoryClear => f.write_str("NumpadMemoryClear"),
601            NumpadMemoryRecall => f.write_str("NumpadMemoryRecall"),
602            NumpadMemoryStore => f.write_str("NumpadMemoryStore"),
603            NumpadMemorySubtract => f.write_str("NumpadMemorySubtract"),
604            NumpadMultiply => f.write_str("NumpadMultiply"),
605            NumpadParenLeft => f.write_str("NumpadParenLeft"),
606            NumpadParenRight => f.write_str("NumpadParenRight"),
607            NumpadStar => f.write_str("NumpadStar"),
608            NumpadSubtract => f.write_str("NumpadSubtract"),
609            Escape => f.write_str("Escape"),
610            Fn => f.write_str("Fn"),
611            FnLock => f.write_str("FnLock"),
612            PrintScreen => f.write_str("PrintScreen"),
613            ScrollLock => f.write_str("ScrollLock"),
614            Pause => f.write_str("Pause"),
615            BrowserBack => f.write_str("BrowserBack"),
616            BrowserFavorites => f.write_str("BrowserFavorites"),
617            BrowserForward => f.write_str("BrowserForward"),
618            BrowserHome => f.write_str("BrowserHome"),
619            BrowserRefresh => f.write_str("BrowserRefresh"),
620            BrowserSearch => f.write_str("BrowserSearch"),
621            BrowserStop => f.write_str("BrowserStop"),
622            Eject => f.write_str("Eject"),
623            LaunchApp1 => f.write_str("LaunchApp1"),
624            LaunchApp2 => f.write_str("LaunchApp2"),
625            LaunchMail => f.write_str("LaunchMail"),
626            MediaPlayPause => f.write_str("MediaPlayPause"),
627            MediaSelect => f.write_str("MediaSelect"),
628            MediaStop => f.write_str("MediaStop"),
629            MediaTrackNext => f.write_str("MediaTrackNext"),
630            MediaTrackPrevious => f.write_str("MediaTrackPrevious"),
631            Power => f.write_str("Power"),
632            Sleep => f.write_str("Sleep"),
633            AudioVolumeDown => f.write_str("AudioVolumeDown"),
634            AudioVolumeMute => f.write_str("AudioVolumeMute"),
635            AudioVolumeUp => f.write_str("AudioVolumeUp"),
636            WakeUp => f.write_str("WakeUp"),
637            Hyper => f.write_str("Hyper"),
638            Super => f.write_str("Super"),
639            Turbo => f.write_str("Turbo"),
640            Abort => f.write_str("Abort"),
641            Resume => f.write_str("Resume"),
642            Suspend => f.write_str("Suspend"),
643            Again => f.write_str("Again"),
644            Copy => f.write_str("Copy"),
645            Cut => f.write_str("Cut"),
646            Find => f.write_str("Find"),
647            Open => f.write_str("Open"),
648            Paste => f.write_str("Paste"),
649            Props => f.write_str("Props"),
650            Select => f.write_str("Select"),
651            Undo => f.write_str("Undo"),
652            Hiragana => f.write_str("Hiragana"),
653            Katakana => f.write_str("Katakana"),
654            Unidentified => f.write_str("Unidentified"),
655            F1 => f.write_str("F1"),
656            F2 => f.write_str("F2"),
657            F3 => f.write_str("F3"),
658            F4 => f.write_str("F4"),
659            F5 => f.write_str("F5"),
660            F6 => f.write_str("F6"),
661            F7 => f.write_str("F7"),
662            F8 => f.write_str("F8"),
663            F9 => f.write_str("F9"),
664            F10 => f.write_str("F10"),
665            F11 => f.write_str("F11"),
666            F12 => f.write_str("F12"),
667            F13 => f.write_str("F13"),
668            F14 => f.write_str("F14"),
669            F15 => f.write_str("F15"),
670            F16 => f.write_str("F16"),
671            F17 => f.write_str("F17"),
672            F18 => f.write_str("F18"),
673            F19 => f.write_str("F19"),
674            F20 => f.write_str("F20"),
675            F21 => f.write_str("F21"),
676            F22 => f.write_str("F22"),
677            F23 => f.write_str("F23"),
678            F24 => f.write_str("F24"),
679            F25 => f.write_str("F25"),
680            F26 => f.write_str("F26"),
681            F27 => f.write_str("F27"),
682            F28 => f.write_str("F28"),
683            F29 => f.write_str("F29"),
684            F30 => f.write_str("F30"),
685            F31 => f.write_str("F31"),
686            F32 => f.write_str("F32"),
687            F33 => f.write_str("F33"),
688            F34 => f.write_str("F34"),
689            F35 => f.write_str("F35"),
690            BrightnessDown => f.write_str("BrightnessDown"),
691            BrightnessUp => f.write_str("BrightnessUp"),
692            DisplayToggleIntExt => f.write_str("DisplayToggleIntExt"),
693            KeyboardLayoutSelect => f.write_str("KeyboardLayoutSelect"),
694            LaunchAssistant => f.write_str("LaunchAssistant"),
695            LaunchControlPanel => f.write_str("LaunchControlPanel"),
696            LaunchScreenSaver => f.write_str("LaunchScreenSaver"),
697            MailForward => f.write_str("MailForward"),
698            MailReply => f.write_str("MailReply"),
699            MailSend => f.write_str("MailSend"),
700            MediaFastForward => f.write_str("MediaFastForward"),
701            MediaPause => f.write_str("MediaPause"),
702            MediaPlay => f.write_str("MediaPlay"),
703            MediaRecord => f.write_str("MediaRecord"),
704            MediaRewind => f.write_str("MediaRewind"),
705            MicrophoneMuteToggle => f.write_str("MicrophoneMuteToggle"),
706            PrivacyScreenToggle => f.write_str("PrivacyScreenToggle"),
707            KeyboardBacklightToggle => f.write_str("KeyboardBacklightToggle"),
708            SelectTask => f.write_str("SelectTask"),
709            ShowAllWindows => f.write_str("ShowAllWindows"),
710            ZoomToggle => f.write_str("ZoomToggle"),
711
712        }
713    }
714}
715
716impl FromStr for Code {
717    type Err = UnrecognizedCodeError;
718
719    fn from_str(s: &str) -> Result<Self, Self::Err> {
720        use crate::Code::*;
721        match s {
722            "Backquote" => Ok(Backquote),
723            "Backslash" => Ok(Backslash),
724            "BracketLeft" => Ok(BracketLeft),
725            "BracketRight" => Ok(BracketRight),
726            "Comma" => Ok(Comma),
727            "Digit0" => Ok(Digit0),
728            "Digit1" => Ok(Digit1),
729            "Digit2" => Ok(Digit2),
730            "Digit3" => Ok(Digit3),
731            "Digit4" => Ok(Digit4),
732            "Digit5" => Ok(Digit5),
733            "Digit6" => Ok(Digit6),
734            "Digit7" => Ok(Digit7),
735            "Digit8" => Ok(Digit8),
736            "Digit9" => Ok(Digit9),
737            "Equal" => Ok(Equal),
738            "IntlBackslash" => Ok(IntlBackslash),
739            "IntlRo" => Ok(IntlRo),
740            "IntlYen" => Ok(IntlYen),
741            "KeyA" => Ok(KeyA),
742            "KeyB" => Ok(KeyB),
743            "KeyC" => Ok(KeyC),
744            "KeyD" => Ok(KeyD),
745            "KeyE" => Ok(KeyE),
746            "KeyF" => Ok(KeyF),
747            "KeyG" => Ok(KeyG),
748            "KeyH" => Ok(KeyH),
749            "KeyI" => Ok(KeyI),
750            "KeyJ" => Ok(KeyJ),
751            "KeyK" => Ok(KeyK),
752            "KeyL" => Ok(KeyL),
753            "KeyM" => Ok(KeyM),
754            "KeyN" => Ok(KeyN),
755            "KeyO" => Ok(KeyO),
756            "KeyP" => Ok(KeyP),
757            "KeyQ" => Ok(KeyQ),
758            "KeyR" => Ok(KeyR),
759            "KeyS" => Ok(KeyS),
760            "KeyT" => Ok(KeyT),
761            "KeyU" => Ok(KeyU),
762            "KeyV" => Ok(KeyV),
763            "KeyW" => Ok(KeyW),
764            "KeyX" => Ok(KeyX),
765            "KeyY" => Ok(KeyY),
766            "KeyZ" => Ok(KeyZ),
767            "Minus" => Ok(Minus),
768            "Period" => Ok(Period),
769            "Quote" => Ok(Quote),
770            "Semicolon" => Ok(Semicolon),
771            "Slash" => Ok(Slash),
772            "AltLeft" => Ok(AltLeft),
773            "AltRight" => Ok(AltRight),
774            "Backspace" => Ok(Backspace),
775            "CapsLock" => Ok(CapsLock),
776            "ContextMenu" => Ok(ContextMenu),
777            "ControlLeft" => Ok(ControlLeft),
778            "ControlRight" => Ok(ControlRight),
779            "Enter" => Ok(Enter),
780            "MetaLeft" | "OSLeft" => Ok(MetaLeft),
781            "MetaRight" | "OSRight" => Ok(MetaRight),
782            "ShiftLeft" => Ok(ShiftLeft),
783            "ShiftRight" => Ok(ShiftRight),
784            "Space" => Ok(Space),
785            "Tab" => Ok(Tab),
786            "Convert" => Ok(Convert),
787            "KanaMode" => Ok(KanaMode),
788            "Lang1" => Ok(Lang1),
789            "Lang2" => Ok(Lang2),
790            "Lang3" => Ok(Lang3),
791            "Lang4" => Ok(Lang4),
792            "Lang5" => Ok(Lang5),
793            "NonConvert" => Ok(NonConvert),
794            "Delete" => Ok(Delete),
795            "End" => Ok(End),
796            "Help" => Ok(Help),
797            "Home" => Ok(Home),
798            "Insert" => Ok(Insert),
799            "PageDown" => Ok(PageDown),
800            "PageUp" => Ok(PageUp),
801            "ArrowDown" => Ok(ArrowDown),
802            "ArrowLeft" => Ok(ArrowLeft),
803            "ArrowRight" => Ok(ArrowRight),
804            "ArrowUp" => Ok(ArrowUp),
805            "NumLock" => Ok(NumLock),
806            "Numpad0" => Ok(Numpad0),
807            "Numpad1" => Ok(Numpad1),
808            "Numpad2" => Ok(Numpad2),
809            "Numpad3" => Ok(Numpad3),
810            "Numpad4" => Ok(Numpad4),
811            "Numpad5" => Ok(Numpad5),
812            "Numpad6" => Ok(Numpad6),
813            "Numpad7" => Ok(Numpad7),
814            "Numpad8" => Ok(Numpad8),
815            "Numpad9" => Ok(Numpad9),
816            "NumpadAdd" => Ok(NumpadAdd),
817            "NumpadBackspace" => Ok(NumpadBackspace),
818            "NumpadClear" => Ok(NumpadClear),
819            "NumpadClearEntry" => Ok(NumpadClearEntry),
820            "NumpadComma" => Ok(NumpadComma),
821            "NumpadDecimal" => Ok(NumpadDecimal),
822            "NumpadDivide" => Ok(NumpadDivide),
823            "NumpadEnter" => Ok(NumpadEnter),
824            "NumpadEqual" => Ok(NumpadEqual),
825            "NumpadHash" => Ok(NumpadHash),
826            "NumpadMemoryAdd" => Ok(NumpadMemoryAdd),
827            "NumpadMemoryClear" => Ok(NumpadMemoryClear),
828            "NumpadMemoryRecall" => Ok(NumpadMemoryRecall),
829            "NumpadMemoryStore" => Ok(NumpadMemoryStore),
830            "NumpadMemorySubtract" => Ok(NumpadMemorySubtract),
831            "NumpadMultiply" => Ok(NumpadMultiply),
832            "NumpadParenLeft" => Ok(NumpadParenLeft),
833            "NumpadParenRight" => Ok(NumpadParenRight),
834            "NumpadStar" => Ok(NumpadStar),
835            "NumpadSubtract" => Ok(NumpadSubtract),
836            "Escape" => Ok(Escape),
837            "Fn" => Ok(Fn),
838            "FnLock" => Ok(FnLock),
839            "PrintScreen" => Ok(PrintScreen),
840            "ScrollLock" => Ok(ScrollLock),
841            "Pause" => Ok(Pause),
842            "BrowserBack" => Ok(BrowserBack),
843            "BrowserFavorites" => Ok(BrowserFavorites),
844            "BrowserForward" => Ok(BrowserForward),
845            "BrowserHome" => Ok(BrowserHome),
846            "BrowserRefresh" => Ok(BrowserRefresh),
847            "BrowserSearch" => Ok(BrowserSearch),
848            "BrowserStop" => Ok(BrowserStop),
849            "Eject" => Ok(Eject),
850            "LaunchApp1" => Ok(LaunchApp1),
851            "LaunchApp2" => Ok(LaunchApp2),
852            "LaunchMail" => Ok(LaunchMail),
853            "MediaPlayPause" => Ok(MediaPlayPause),
854            "MediaSelect" | "LaunchMediaPlayer" => Ok(MediaSelect),
855            "MediaStop" => Ok(MediaStop),
856            "MediaTrackNext" => Ok(MediaTrackNext),
857            "MediaTrackPrevious" => Ok(MediaTrackPrevious),
858            "Power" => Ok(Power),
859            "Sleep" => Ok(Sleep),
860            "AudioVolumeDown" | "VolumeDown" => Ok(AudioVolumeDown),
861            "AudioVolumeMute" | "VolumeMute" => Ok(AudioVolumeMute),
862            "AudioVolumeUp" | "VolumeUp" => Ok(AudioVolumeUp),
863            "WakeUp" => Ok(WakeUp),
864            "Hyper" => Ok(Hyper),
865            "Super" => Ok(Super),
866            "Turbo" => Ok(Turbo),
867            "Abort" => Ok(Abort),
868            "Resume" => Ok(Resume),
869            "Suspend" => Ok(Suspend),
870            "Again" => Ok(Again),
871            "Copy" => Ok(Copy),
872            "Cut" => Ok(Cut),
873            "Find" => Ok(Find),
874            "Open" => Ok(Open),
875            "Paste" => Ok(Paste),
876            "Props" => Ok(Props),
877            "Select" => Ok(Select),
878            "Undo" => Ok(Undo),
879            "Hiragana" => Ok(Hiragana),
880            "Katakana" => Ok(Katakana),
881            "Unidentified" => Ok(Unidentified),
882            "F1" => Ok(F1),
883            "F2" => Ok(F2),
884            "F3" => Ok(F3),
885            "F4" => Ok(F4),
886            "F5" => Ok(F5),
887            "F6" => Ok(F6),
888            "F7" => Ok(F7),
889            "F8" => Ok(F8),
890            "F9" => Ok(F9),
891            "F10" => Ok(F10),
892            "F11" => Ok(F11),
893            "F12" => Ok(F12),
894            "F13" => Ok(F13),
895            "F14" => Ok(F14),
896            "F15" => Ok(F15),
897            "F16" => Ok(F16),
898            "F17" => Ok(F17),
899            "F18" => Ok(F18),
900            "F19" => Ok(F19),
901            "F20" => Ok(F20),
902            "F21" => Ok(F21),
903            "F22" => Ok(F22),
904            "F23" => Ok(F23),
905            "F24" => Ok(F24),
906            "F25" => Ok(F25),
907            "F26" => Ok(F26),
908            "F27" => Ok(F27),
909            "F28" => Ok(F28),
910            "F29" => Ok(F29),
911            "F30" => Ok(F30),
912            "F31" => Ok(F31),
913            "F32" => Ok(F32),
914            "F33" => Ok(F33),
915            "F34" => Ok(F34),
916            "F35" => Ok(F35),
917            "BrightnessDown" => Ok(BrightnessDown),
918            "BrightnessUp" => Ok(BrightnessUp),
919            "DisplayToggleIntExt" => Ok(DisplayToggleIntExt),
920            "KeyboardLayoutSelect" => Ok(KeyboardLayoutSelect),
921            "LaunchAssistant" => Ok(LaunchAssistant),
922            "LaunchControlPanel" => Ok(LaunchControlPanel),
923            "LaunchScreenSaver" => Ok(LaunchScreenSaver),
924            "MailForward" => Ok(MailForward),
925            "MailReply" => Ok(MailReply),
926            "MailSend" => Ok(MailSend),
927            "MediaFastForward" => Ok(MediaFastForward),
928            "MediaPause" => Ok(MediaPause),
929            "MediaPlay" => Ok(MediaPlay),
930            "MediaRecord" => Ok(MediaRecord),
931            "MediaRewind" => Ok(MediaRewind),
932            "MicrophoneMuteToggle" => Ok(MicrophoneMuteToggle),
933            "PrivacyScreenToggle" => Ok(PrivacyScreenToggle),
934            "KeyboardBacklightToggle" => Ok(KeyboardBacklightToggle),
935            "SelectTask" => Ok(SelectTask),
936            "ShowAllWindows" => Ok(ShowAllWindows),
937            "ZoomToggle" => Ok(ZoomToggle),
938
939            _ => Err(UnrecognizedCodeError),
940        }
941    }
942}
943
944#[derive(Clone, Debug)]
946pub struct UnrecognizedCodeError;
947
948impl fmt::Display for UnrecognizedCodeError {
949    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
950        write!(f, "Unrecognized code")
951    }
952}
953
954impl Error for UnrecognizedCodeError {}