devela/ui/event/key/
alpha_pad.rs

1// devela::ui::event::key::alpha_pad
2//
3//! Defines [`KeyAlpha`], [`KeyPad`].
4//
5
6/* definitions */
7
8/// Alphanumeric (A-Z, 0-9) keys.
9#[repr(u8)]
10#[allow(missing_docs)] #[rustfmt::skip]
11#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
12pub enum KeyAlpha {
13    A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z,
14    Num0, Num1, Num2, Num3, Num4, Num5, Num6, Num7, Num8, Num9,
15}
16
17/// Keypad keys.
18#[repr(u8)]
19#[non_exhaustive]
20#[allow(missing_docs)] #[rustfmt::skip]
21#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
22pub enum KeyPad {
23    Num0, Num1, Num2, Num3, Num4, Num5, Num6, Num7, Num8, Num9,
24    Multiply, Add, Subtract, Divide, Decimal,
25    Enter, Equal,
26}
27
28/* impls */
29
30#[rustfmt::skip]
31#[cfg(feature = "js")]
32#[cfg_attr(nightly_doc, doc(cfg(feature = "js")))]
33impl KeyAlpha {
34    /// Attempts to construct a `KeyAlpha` from a JavaScript `KeyboardEvent` physical [code].
35    ///
36    /// [code]: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code
37    pub const fn from_js_code(code: &str) -> Option<Self> {
38        use KeyAlpha as K;
39        match code.as_bytes() {
40            b"KeyA" => Some(K::A), b"KeyB" => Some(K::B), b"KeyC" => Some(K::C),
41            b"KeyD" => Some(K::D), b"KeyE" => Some(K::E), b"KeyF" => Some(K::F),
42            b"KeyG" => Some(K::G), b"KeyH" => Some(K::H), b"KeyI" => Some(K::I),
43            b"KeyJ" => Some(K::J), b"KeyK" => Some(K::K), b"KeyL" => Some(K::L),
44            b"KeyM" => Some(K::M), b"KeyN" => Some(K::N), b"KeyO" => Some(K::O),
45            b"KeyP" => Some(K::P), b"KeyQ" => Some(K::Q), b"KeyR" => Some(K::R),
46            b"KeyS" => Some(K::S), b"KeyT" => Some(K::T), b"KeyU" => Some(K::U),
47            b"KeyV" => Some(K::V), b"KeyW" => Some(K::W), b"KeyX" => Some(K::X),
48            b"KeyY" => Some(K::Y), b"KeyZ" => Some(K::Z),
49            b"Digit0" => Some(K::Num0), b"Digit1" => Some(K::Num1), b"Digit2" => Some(K::Num2),
50            b"Digit3" => Some(K::Num3), b"Digit4" => Some(K::Num4), b"Digit5" => Some(K::Num5),
51            b"Digit6" => Some(K::Num6), b"Digit7" => Some(K::Num7), b"Digit8" => Some(K::Num8),
52            b"Digit9" => Some(K::Num9),
53            _ => None,
54        }
55    }
56    /// Returns a JavaScript `KeyboardEvent` physical [code].
57    ///
58    /// [code]: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code
59    pub const fn to_js_code(self) -> &'static str {
60        use KeyAlpha as K;
61        match self {
62            K::A => "KeyA", K::B => "KeyB", K::C => "KeyC", K::D => "KeyD", K::E => "KeyE",
63            K::F => "KeyF", K::G => "KeyG", K::H => "KeyH", K::I => "KeyI", K::J => "KeyJ",
64            K::K => "KeyK", K::L => "KeyL", K::M => "KeyM", K::N => "KeyN", K::O => "KeyO",
65            K::P => "KeyP", K::Q => "KeyQ", K::R => "KeyR", K::S => "KeyS", K::T => "KeyT",
66            K::U => "KeyU", K::V => "KeyV", K::W => "KeyW", K::X => "KeyX", K::Y => "KeyY",
67            K::Z => "KeyZ",
68            K::Num0 => "Digit0", K::Num1 => "Digit1", K::Num2 => "Digit2", K::Num3 => "Digit3",
69            K::Num4 => "Digit4", K::Num5 => "Digit5", K::Num6 => "Digit6", K::Num7 => "Digit7",
70            K::Num8 => "Digit8", K::Num9 => "Digit9",
71        }
72    }
73
74    /// Attempts to construct a `KeyAlpha` from a JavaScript `KeyboardEvent` semantic [key].
75    ///
76    /// [key]: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key
77    pub const fn from_js_key(key: &str) -> Option<Self> {
78        use KeyAlpha as K;
79        match key.as_bytes() {
80            b"A" => Some(K::A), b"B" => Some(K::B), b"C" => Some(K::C),
81            b"D" => Some(K::D), b"E" => Some(K::E), b"F" => Some(K::F),
82            b"G" => Some(K::G), b"H" => Some(K::H), b"I" => Some(K::I),
83            b"J" => Some(K::J), b"K" => Some(K::K), b"L" => Some(K::L),
84            b"M" => Some(K::M), b"N" => Some(K::N), b"O" => Some(K::O),
85            b"P" => Some(K::P), b"Q" => Some(K::Q), b"R" => Some(K::R),
86            b"S" => Some(K::S), b"T" => Some(K::T), b"U" => Some(K::U),
87            b"V" => Some(K::V), b"W" => Some(K::W), b"X" => Some(K::X),
88            b"Y" => Some(K::Y), b"Z" => Some(K::Z),
89            b"0" => Some(K::Num0), b"1" => Some(K::Num1), b"2" => Some(K::Num2),
90            b"3" => Some(K::Num3), b"4" => Some(K::Num4), b"5" => Some(K::Num5),
91            b"6" => Some(K::Num6), b"7" => Some(K::Num7), b"8" => Some(K::Num8),
92            b"9" => Some(K::Num9),
93            _ => None,
94        }
95    }
96    /// Returns a JavaScript `KeyboardEvent` semantic [key].
97    ///
98    /// [key]: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key
99    pub const fn to_js_key(self) -> &'static str {
100        use KeyAlpha as K;
101        match self {
102            K::A => "A", K::B => "B", K::C => "C", K::D => "D", K::E => "E", K::F => "F",
103            K::G => "G", K::H => "H", K::I => "I", K::J => "J", K::K => "K", K::L => "L",
104            K::M => "M", K::N => "N", K::O => "O", K::P => "P", K::Q => "Q", K::R => "R",
105            K::S => "S", K::T => "T", K::U => "U", K::V => "V", K::W => "W", K::X => "X",
106            K::Y => "Y", K::Z => "Z",
107            K::Num0 => "0", K::Num1 => "1", K::Num2 => "2", K::Num3 => "3", K::Num4 => "4",
108            K::Num5 => "5", K::Num6 => "6", K::Num7 => "7", K::Num8 => "8", K::Num9 => "9",
109        }
110    }
111}
112#[rustfmt::skip]
113#[cfg(feature = "js")]
114#[cfg_attr(nightly_doc, doc(cfg(feature = "js")))]
115impl KeyPad {
116    /// Attempts to construct a `KeyPad` from a JavaScript `KeyboardEvent` physical [code].
117    ///
118    /// [code]: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code
119    pub const fn from_js_code(code: &str) -> Option<Self> {
120        use KeyPad as K;
121        match code.as_bytes() {
122            b"Numpad0" => Some(K::Num0), b"Numpad1" => Some(K::Num1), b"Numpad2" => Some(K::Num2),
123            b"Numpad3" => Some(K::Num3), b"Numpad4" => Some(K::Num4), b"Numpad5" => Some(K::Num5),
124            b"Numpad6" => Some(K::Num6), b"Numpad7" => Some(K::Num7), b"Numpad8" => Some(K::Num8),
125            b"Numpad9" => Some(K::Num9), b"NumpadMultiply" => Some(K::Multiply),
126            b"NumpadAdd" => Some(K::Add), b"NumpadSubtract" => Some(K::Subtract),
127            b"NumpadDivide" => Some(K::Divide), b"NumpadDecimal" => Some(K::Decimal),
128            b"NumpadEnter" => Some(K::Enter), b"NumpadEqual" => Some(K::Equal),
129            _ => None,
130        }
131    }
132    /// Returns a JavaScript `KeyboardEvent` physical [code].
133    ///
134    /// [code]: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code
135    pub const fn to_js_code(self) -> &'static str {
136        use KeyPad as K;
137        match self {
138            K::Num0 => "Numpad0", K::Num1 => "Numpad1", K::Num2 => "Numpad2",
139            K::Num3 => "Numpad3", K::Num4 => "Numpad4", K::Num5 => "Numpad5",
140            K::Num6 => "Numpad6", K::Num7 => "Numpad7", K::Num8 => "Numpad8",
141            K::Num9 => "Numpad9", K::Multiply => "NumpadMultiply", K::Add => "NumpadAdd",
142            K::Subtract => "NumpadSubtract", K::Divide => "NumpadDivide",
143            K::Decimal => "NumpadDecimal", K::Enter => "NumpadEnter", K::Equal => "NumpadEqual",
144        }
145    }
146
147    /// Attempts to construct a `KeyPad` from a JavaScript `KeyboardEvent` semantic [key].
148    ///
149    /// [key]: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key
150    pub const fn from_js_key(key: &str) -> Option<Self> {
151        use KeyPad as K;
152        match key.as_bytes() {
153            b"0" => Some(K::Num0), b"1" => Some(K::Num1), b"2" => Some(K::Num2),
154            b"3" => Some(K::Num3), b"4" => Some(K::Num4), b"5" => Some(K::Num5),
155            b"6" => Some(K::Num6), b"7" => Some(K::Num7), b"8" => Some(K::Num8),
156            b"9" => Some(K::Num9), b"*" => Some(K::Multiply), b"+" => Some(K::Add),
157            b"-" => Some(K::Subtract), b"/" => Some(K::Divide), b"." => Some(K::Decimal),
158            b"Enter" => Some(K::Enter), b"=" => Some(K::Equal),
159            _ => None,
160        }
161    }
162    /// Returns a JavaScript `KeyboardEvent` semantic [key].
163    ///
164    /// [key]: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key
165    pub const fn to_js_key(self) -> &'static str {
166        use KeyPad as K;
167        match self {
168            K::Num0 => "0", K::Num1 => "1", K::Num2 => "2", K::Num3 => "3", K::Num4 => "4",
169            K::Num5 => "5", K::Num6 => "6", K::Num7 => "7", K::Num8 => "8", K::Num9 => "9",
170            K::Multiply => "*", K::Add => "+", K::Subtract => "-", K::Divide => "/",
171            K::Decimal => ".", K::Enter => "Enter", K::Equal => "=",
172        }
173    }
174}