mouse_codes/mapping/standard/
mod.rs

1//! Standard mouse button code mappings for cross-platform compatibility
2
3use crate::types::{Button, Platform};
4
5/// Parse a button from a string with exact matching
6pub fn parse_button_from_str(s: &str) -> Result<Button, crate::error::MouseParseError> {
7    match s {
8        "Left" => Ok(Button::Left),
9        "Right" => Ok(Button::Right),
10        "Middle" => Ok(Button::Middle),
11        "X1" => Ok(Button::X1),
12        "X2" => Ok(Button::X2),
13        "Extra3" => Ok(Button::Extra3),
14        "Extra4" => Ok(Button::Extra4),
15        "Extra5" => Ok(Button::Extra5),
16        "Extra6" => Ok(Button::Extra6),
17        "Extra7" => Ok(Button::Extra7),
18        "Extra8" => Ok(Button::Extra8),
19        #[cfg(feature = "extended")]
20        "Extra9" => Ok(Button::Extra9),
21        #[cfg(feature = "extended")]
22        "Extra10" => Ok(Button::Extra10),
23        _ => Err(crate::error::MouseParseError::UnknownButton(s.to_string())),
24    }
25}
26
27/// Parse a button from a string with case-insensitive matching
28pub fn parse_button_ignore_case(s: &str) -> Result<Button, crate::error::MouseParseError> {
29    let s = s.to_ascii_lowercase();
30    match s.as_str() {
31        "left" => Ok(Button::Left),
32        "right" => Ok(Button::Right),
33        "middle" => Ok(Button::Middle),
34        "x1" => Ok(Button::X1),
35        "x2" => Ok(Button::X2),
36        "extra3" => Ok(Button::Extra3),
37        "extra4" => Ok(Button::Extra4),
38        "extra5" => Ok(Button::Extra5),
39        "extra6" => Ok(Button::Extra6),
40        "extra7" => Ok(Button::Extra7),
41        "extra8" => Ok(Button::Extra8),
42        #[cfg(feature = "extended")]
43        "extra9" => Ok(Button::Extra9),
44        #[cfg(feature = "extended")]
45        "extra10" => Ok(Button::Extra10),
46        _ => Err(crate::error::MouseParseError::UnknownButton(s)),
47    }
48}
49
50// 根据特性选择不同的实现
51#[cfg(feature = "phf")]
52mod phf_impl;
53#[cfg(feature = "phf")]
54pub use phf_impl::CodeMapperImpl as CodeMapper;
55
56#[cfg(not(feature = "phf"))]
57mod hashmap_impl;
58#[cfg(not(feature = "phf"))]
59pub use hashmap_impl::CodeMapperImpl as CodeMapper;
60
61// 为 Button 实现 CodeMapper  trait(转发到具体实现)
62impl crate::types::CodeMapper for Button {
63    fn to_code(&self, platform: Platform) -> usize {
64        <Self as CodeMapper>::to_code(self, platform)
65    }
66
67    fn from_code(code: usize, platform: Platform) -> Option<Self> {
68        <Self as CodeMapper>::from_code(code, platform)
69    }
70}