keyboard_codes/parser/
mod.rs

1//! Advanced keyboard input parsing with alias support and flexible formatting
2
3mod aliases;
4mod shortcut;
5
6pub use aliases::{normalize_key_name, normalize_modifier_name};
7pub use shortcut::{
8    parse_input, parse_shortcut_flexible, parse_shortcut_sequence, parse_shortcut_with_aliases,
9    Shortcut,
10};
11
12// Re-export the core parsing functions from standard mapping
13pub use crate::mapping::standard::{parse_key_ignore_case, parse_modifier_ignore_case};
14
15/// Parse a modifier from string with alias and case-insensitive support
16pub fn parse_modifier_with_aliases(s: &str) -> Result<crate::Modifier, crate::KeyParseError> {
17    if s.is_empty() {
18        return Err(crate::KeyParseError::UnknownModifier(
19            "empty string".to_string(),
20        ));
21    }
22
23    let input_lower = s.to_lowercase();
24
25    // First check if the input is a direct alias
26    if let Some(&standard_name) = aliases::MODIFIER_ALIASES.get(input_lower.as_str()) {
27        // Look up the standard name in the mappings
28        return crate::mapping::standard::STANDARD_MODIFIER_MAPPINGS
29            .iter()
30            .find(|(name, _, _, _, _)| name.eq_ignore_ascii_case(standard_name))
31            .map(|(_, modifier, _, _, _)| *modifier)
32            .ok_or_else(|| crate::KeyParseError::UnknownModifier(s.to_string()));
33    }
34
35    // If no alias found, try direct case-insensitive matching
36    parse_modifier_ignore_case(s)
37}
38
39/// Parse any keyboard input (key or modifier) with alias support
40pub fn parse_keyboard_input(input: &str) -> Result<crate::KeyboardInput, crate::KeyParseError> {
41    crate::KeyboardInput::parse_with_aliases(input)
42}