use crate::types::{Button, Platform};
use phf::phf_map;
static WINDOWS_CODE_MAP: phf::Map<u8, usize> = phf_map! {
0u8 => 1, 1u8 => 2, 2u8 => 4, 3u8 => 5, 4u8 => 6, 5u8 => 7, 6u8 => 8, 7u8 => 9, 8u8 => 10, 9u8 => 11, 10u8 => 12, #[cfg(feature = "extended")]
11u8 => 13, #[cfg(feature = "extended")]
12u8 => 14, };
static LINUX_CODE_MAP: phf::Map<u8, usize> = phf_map! {
0u8 => 1, 1u8 => 3, 2u8 => 2, 3u8 => 8, 4u8 => 9, 5u8 => 10, 6u8 => 11, 7u8 => 12, 8u8 => 13, 9u8 => 14, 10u8 => 15, #[cfg(feature = "extended")]
11u8 => 16, #[cfg(feature = "extended")]
12u8 => 17, };
static MACOS_CODE_MAP: phf::Map<u8, usize> = phf_map! {
0u8 => 0, 1u8 => 1, 2u8 => 2, 3u8 => 3, 4u8 => 4, 5u8 => 5, 6u8 => 6, 7u8 => 7, 8u8 => 8, 9u8 => 9, 10u8 => 10, #[cfg(feature = "extended")]
11u8 => 11, #[cfg(feature = "extended")]
12u8 => 12, };
static WINDOWS_REVERSE_MAP: phf::Map<usize, Button> = phf_map! {
1usize => Button::Left,
2usize => Button::Right,
4usize => Button::Middle,
5usize => Button::X1,
6usize => Button::X2,
7usize => Button::Extra3,
8usize => Button::Extra4,
9usize => Button::Extra5,
10usize => Button::Extra6,
11usize => Button::Extra7,
12usize => Button::Extra8,
#[cfg(feature = "extended")]
13usize => Button::Extra9,
#[cfg(feature = "extended")]
14usize => Button::Extra10,
};
static LINUX_REVERSE_MAP: phf::Map<usize, Button> = phf_map! {
1usize => Button::Left,
3usize => Button::Right,
2usize => Button::Middle,
8usize => Button::X1,
9usize => Button::X2,
10usize => Button::Extra3,
11usize => Button::Extra4,
12usize => Button::Extra5,
13usize => Button::Extra6,
14usize => Button::Extra7,
15usize => Button::Extra8,
#[cfg(feature = "extended")]
16usize => Button::Extra9,
#[cfg(feature = "extended")]
17usize => Button::Extra10,
};
static MACOS_REVERSE_MAP: phf::Map<usize, Button> = phf_map! {
0usize => Button::Left,
1usize => Button::Right,
2usize => Button::Middle,
3usize => Button::X1,
4usize => Button::X2,
5usize => Button::Extra3,
6usize => Button::Extra4,
7usize => Button::Extra5,
8usize => Button::Extra6,
9usize => Button::Extra7,
10usize => Button::Extra8,
#[cfg(feature = "extended")]
11usize => Button::Extra9,
#[cfg(feature = "extended")]
12usize => Button::Extra10,
};
impl From<Button> for u8 {
fn from(btn: Button) -> Self {
match btn {
Button::Left => 0,
Button::Right => 1,
Button::Middle => 2,
Button::X1 => 3,
Button::X2 => 4,
Button::Extra3 => 5,
Button::Extra4 => 6,
Button::Extra5 => 7,
Button::Extra6 => 8,
Button::Extra7 => 9,
Button::Extra8 => 10,
#[cfg(feature = "extended")]
Button::Extra9 => 11,
#[cfg(feature = "extended")]
Button::Extra10 => 12,
}
}
}
pub trait CodeMapperImpl {
fn to_code(&self, platform: Platform) -> usize;
fn from_code(code: usize, platform: Platform) -> Option<Self>
where
Self: Sized;
}
impl CodeMapperImpl for Button {
fn to_code(&self, platform: Platform) -> usize {
match platform {
Platform::Windows => WINDOWS_CODE_MAP[&u8::from(*self)],
Platform::Linux => LINUX_CODE_MAP[&u8::from(*self)],
Platform::MacOS => MACOS_CODE_MAP[&u8::from(*self)],
}
}
fn from_code(code: usize, platform: Platform) -> Option<Self> {
match platform {
Platform::Windows => WINDOWS_REVERSE_MAP.get(&code).copied(),
Platform::Linux => LINUX_REVERSE_MAP.get(&code).copied(),
Platform::MacOS => MACOS_REVERSE_MAP.get(&code).copied(),
}
}
}