#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Key {
Enter,
Tab,
Escape,
Backspace,
Delete,
Space,
ArrowUp,
ArrowDown,
ArrowLeft,
ArrowRight,
Home,
End,
PageUp,
PageDown,
}
impl Key {
#[must_use]
pub fn properties(self) -> (&'static str, &'static str, u32, bool) {
match self {
Key::Enter => ("Enter", "Enter", 13, false),
Key::Tab => ("Tab", "Tab", 9, false),
Key::Escape => ("Escape", "Escape", 27, false),
Key::Backspace => ("Backspace", "Backspace", 8, false),
Key::Delete => ("Delete", "Delete", 46, false),
Key::Space => (" ", "Space", 32, true),
Key::ArrowUp => ("ArrowUp", "ArrowUp", 38, false),
Key::ArrowDown => ("ArrowDown", "ArrowDown", 40, false),
Key::ArrowLeft => ("ArrowLeft", "ArrowLeft", 37, false),
Key::ArrowRight => ("ArrowRight", "ArrowRight", 39, false),
Key::Home => ("Home", "Home", 36, false),
Key::End => ("End", "End", 35, false),
Key::PageUp => ("PageUp", "PageUp", 33, false),
Key::PageDown => ("PageDown", "PageDown", 34, false),
}
}
#[inline]
#[must_use]
pub fn key(self) -> &'static str {
self.properties().0
}
#[inline]
#[must_use]
pub fn code(self) -> &'static str {
self.properties().1
}
#[inline]
#[must_use]
pub fn key_code(self) -> u32 {
self.properties().2
}
#[inline]
#[must_use]
pub fn is_printable(self) -> bool {
self.properties().3
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_key_properties() {
let (key, code, key_code, printable) = Key::Enter.properties();
assert_eq!(key, "Enter");
assert_eq!(code, "Enter");
assert_eq!(key_code, 13);
assert!(!printable);
}
#[test]
fn test_space_is_printable() {
assert!(Key::Space.is_printable());
assert!(!Key::Enter.is_printable());
}
}