keyboard-codes 0.3.0

Cross-platform keyboard key code mapping and conversion
Documentation
//! 宏系统示例
//! 运行: cargo run --example macro_system

use keyboard_codes::{
    current_platform, parse_keyboard_input, parse_shortcut_with_aliases, Key, KeyCodeMapper,
    Modifier, Shortcut,
};

fn main() {
    println!("=== 宏系统示例 ===\n");

    let platform = current_platform();
    println!("当前平台: {}\n", platform);

    // 演示宏录制概念
    println!("宏录制概念演示:");

    // 定义一些宏步骤 - 修复解析问题
    let macro_steps = [
        ("输入文本", "Hello", MacroActionType::Text),
        ("快捷键", "ctrl+a", MacroActionType::Shortcut),
        ("快捷键", "ctrl+c", MacroActionType::Shortcut),
        ("导航", "arrowdown", MacroActionType::SingleKey),
        ("快捷键", "ctrl+v", MacroActionType::Shortcut),
        ("功能键", "f5", MacroActionType::SingleKey),
        ("修饰键", "shift", MacroActionType::SingleKey),
    ];

    for (i, (action, input, action_type)) in macro_steps.iter().enumerate() {
        println!("  步骤 {}: {} -> '{}'", i + 1, action, input);

        match action_type {
            MacroActionType::Text => {
                // 文本输入 - 分解为单个字符
                println!("      -> 文本输入: '{}'", input);
                for ch in input.chars() {
                    if let Ok(keyboard_input) = parse_keyboard_input(&ch.to_string()) {
                        let vk_code = keyboard_input.to_code(platform);
                        println!(
                            "        字符 '{}' -> {} (VK: 0x{:02X})",
                            ch, keyboard_input, vk_code
                        );
                    }
                }
            }
            MacroActionType::Shortcut => {
                // 快捷方式解析
                match parse_shortcut_with_aliases(input) {
                    Ok(shortcut) => {
                        let modifier_codes: Vec<String> = shortcut
                            .modifiers
                            .iter()
                            .map(|m| format!("0x{:02X}", m.to_code(platform)))
                            .collect();
                        let key_code = shortcut.key.to_code(platform);
                        println!(
                            "      -> 快捷方式: {} (修饰键: {:?}, 主键: 0x{:02X})",
                            shortcut, modifier_codes, key_code
                        );
                    }
                    Err(e) => {
                        println!("      -> 解析失败: {}", e);
                    }
                }
            }
            MacroActionType::SingleKey => {
                // 单个键解析
                match parse_keyboard_input(input) {
                    Ok(keyboard_input) => {
                        let vk_code = keyboard_input.to_code(platform);
                        println!("      -> {} (VK: 0x{:02X})", keyboard_input, vk_code);
                    }
                    Err(e) => {
                        println!("      -> 解析失败: {}", e);
                    }
                }
            }
        }
    }

    // 演示宏回放概念
    println!("\n宏回放概念演示:");

    let playback_macro = vec![
        MacroStep::Shortcut(parse_shortcut_with_aliases("ctrl+a").unwrap()),
        MacroStep::Shortcut(parse_shortcut_with_aliases("ctrl+c").unwrap()),
        MacroStep::Key(Key::ArrowDown),
        MacroStep::Shortcut(parse_shortcut_with_aliases("ctrl+v").unwrap()),
    ];

    for (i, step) in playback_macro.iter().enumerate() {
        println!("  执行步骤 {}: {}", i + 1, step);
    }

    println!("\n示例完成!");
}

#[derive(Debug)]
enum MacroActionType {
    Text,
    Shortcut,
    SingleKey,
}

#[derive(Debug)]
enum MacroStep {
    Key(Key),
    #[allow(dead_code)]
    Modifier(Modifier),
    Shortcut(Shortcut),
    #[allow(dead_code)]
    Text(String),
}

impl std::fmt::Display for MacroStep {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            MacroStep::Key(key) => write!(f, "按键: {}", key),
            MacroStep::Modifier(modifier) => write!(f, "修饰键: {}", modifier),
            MacroStep::Shortcut(shortcut) => write!(f, "快捷方式: {}", shortcut),
            MacroStep::Text(text) => write!(f, "文本: '{}'", text),
        }
    }
}