use windows_sys::Win32::UI::Input::KeyboardAndMouse::{
VIRTUAL_KEY, VK_DOWN, VK_END, VK_ESCAPE, VK_HOME, VK_LEFT, VK_RETURN, VK_RIGHT, VK_SPACE, VK_UP,
};
use crate::keynav::NavKey;
pub(super) fn translate_vk(vk: VIRTUAL_KEY) -> Option<NavKey> {
match vk {
VK_DOWN => Some(NavKey::Down),
VK_UP => Some(NavKey::Up),
VK_RIGHT => Some(NavKey::Right),
VK_LEFT => Some(NavKey::Left),
VK_RETURN | VK_SPACE => Some(NavKey::Activate),
VK_ESCAPE => Some(NavKey::Escape),
VK_HOME => Some(NavKey::Home),
VK_END => Some(NavKey::End),
0x30..=0x39 => Some(NavKey::Char((b'0' + (vk as u8 - 0x30)) as char)),
0x41..=0x5A => Some(NavKey::Char((b'a' + (vk as u8 - 0x41)) as char)),
_ => None,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn named_navigation_keys_map_by_code() {
assert_eq!(translate_vk(VK_DOWN), Some(NavKey::Down));
assert_eq!(translate_vk(VK_ESCAPE), Some(NavKey::Escape));
assert_eq!(translate_vk(VK_RETURN), Some(NavKey::Activate));
assert_eq!(translate_vk(VK_SPACE), Some(NavKey::Activate));
}
#[test]
fn alphanumeric_keys_map_to_lowercase_chars() {
assert_eq!(translate_vk(0x41), Some(NavKey::Char('a'))); assert_eq!(translate_vk(0x5A), Some(NavKey::Char('z'))); assert_eq!(translate_vk(0x30), Some(NavKey::Char('0'))); }
#[test]
fn unmapped_keys_are_ignored() {
assert_eq!(translate_vk(0x10), None); }
}