keyboard-codes 0.2.0

Cross-platform keyboard key code mapping and conversion
Documentation
//! Advanced keyboard input parsing with alias support and flexible formatting

mod aliases;
mod shortcut;

pub use aliases::{normalize_key_name, normalize_modifier_name};
pub use shortcut::{
    parse_input, parse_shortcut_flexible, parse_shortcut_sequence, parse_shortcut_with_aliases,
    Shortcut,
};

// Re-export the core parsing functions from standard mapping
pub use crate::mapping::standard::{parse_key_ignore_case, parse_modifier_ignore_case};

/// Parse a modifier from string with alias and case-insensitive support
pub fn parse_modifier_with_aliases(s: &str) -> Result<crate::Modifier, crate::KeyParseError> {
    if s.is_empty() {
        return Err(crate::KeyParseError::UnknownModifier(
            "empty string".to_string(),
        ));
    }

    let input_lower = s.to_lowercase();

    // First check if the input is a direct alias
    if let Some(&standard_name) = aliases::MODIFIER_ALIASES.get(input_lower.as_str()) {
        // Look up the standard name in the mappings
        return crate::mapping::standard::STANDARD_MODIFIER_MAPPINGS
            .iter()
            .find(|(name, _, _, _, _)| name.eq_ignore_ascii_case(standard_name))
            .map(|(_, modifier, _, _, _)| *modifier)
            .ok_or_else(|| crate::KeyParseError::UnknownModifier(s.to_string()));
    }

    // If no alias found, try direct case-insensitive matching
    parse_modifier_ignore_case(s)
}