rustenium 1.1.8

A modern, robust, high-performance WebDriver BiDi automation library for Rust
Documentation
/// A single key definition from the US keyboard layout.
/// Maps a human-readable key name (e.g. `"Enter"`, `"ArrowLeft"`) to the
/// parameters required by `Input.dispatchKeyEvent`.
#[derive(Debug, Clone, Copy)]
pub struct KeyDefinition {
    /// Virtual key code sent as `windowsVirtualKeyCode`.
    pub key_code: Option<i64>,
    /// The `key` field (e.g. `"Enter"`, `"a"`).
    pub key: &'static str,
    /// The `code` field (e.g. `"Enter"`, `"KeyA"`).
    pub code: &'static str,
    /// `text` field for keyDown (printable single-char keys).
    pub text: Option<&'static str>,
    /// `key` when Shift is held.
    pub shift_key: Option<&'static str>,
    /// `text` when Shift is held.
    pub shift_text: Option<&'static str>,
    /// 0 = standard, 1 = left, 2 = right, 3 = numpad.
    pub location: Option<i64>,
}

/// Look up a key by its `key` value or `code` value.
pub fn key_definition(key: &str) -> Option<KeyDefinition> {
    match key {
        "\r" | "\n" | "Enter" => Some(KeyDefinition {
            key_code: Some(13),
            key: "Enter",
            code: "Enter",
            text: Some("\r"),
            shift_key: None,
            shift_text: None,
            location: None,
        }),
        "Tab" => Some(KeyDefinition {
            key_code: Some(9),
            key: "Tab",
            code: "Tab",
            text: Some("\t"),
            shift_key: None,
            shift_text: None,
            location: None,
        }),
        "Backspace" => Some(KeyDefinition {
            key_code: Some(8),
            key: "Backspace",
            code: "Backspace",
            text: None,
            shift_key: None,
            shift_text: None,
            location: None,
        }),
        "Escape" => Some(KeyDefinition {
            key_code: Some(27),
            key: "Escape",
            code: "Escape",
            text: None,
            shift_key: None,
            shift_text: None,
            location: None,
        }),
        "Delete" => Some(KeyDefinition {
            key_code: Some(46),
            key: "Delete",
            code: "Delete",
            text: None,
            shift_key: None,
            shift_text: None,
            location: None,
        }),
        "Insert" => Some(KeyDefinition {
            key_code: Some(45),
            key: "Insert",
            code: "Insert",
            text: None,
            shift_key: None,
            shift_text: None,
            location: None,
        }),
        "Home" => Some(KeyDefinition {
            key_code: Some(36),
            key: "Home",
            code: "Home",
            text: None,
            shift_key: None,
            shift_text: None,
            location: None,
        }),
        "End" => Some(KeyDefinition {
            key_code: Some(35),
            key: "End",
            code: "End",
            text: None,
            shift_key: None,
            shift_text: None,
            location: None,
        }),
        "PageUp" => Some(KeyDefinition {
            key_code: Some(33),
            key: "PageUp",
            code: "PageUp",
            text: None,
            shift_key: None,
            shift_text: None,
            location: None,
        }),
        "PageDown" => Some(KeyDefinition {
            key_code: Some(34),
            key: "PageDown",
            code: "PageDown",
            text: None,
            shift_key: None,
            shift_text: None,
            location: None,
        }),
        "ArrowLeft" => Some(KeyDefinition {
            key_code: Some(37),
            key: "ArrowLeft",
            code: "ArrowLeft",
            text: None,
            shift_key: None,
            shift_text: None,
            location: None,
        }),
        "ArrowUp" => Some(KeyDefinition {
            key_code: Some(38),
            key: "ArrowUp",
            code: "ArrowUp",
            text: None,
            shift_key: None,
            shift_text: None,
            location: None,
        }),
        "ArrowRight" => Some(KeyDefinition {
            key_code: Some(39),
            key: "ArrowRight",
            code: "ArrowRight",
            text: None,
            shift_key: None,
            shift_text: None,
            location: None,
        }),
        "ArrowDown" => Some(KeyDefinition {
            key_code: Some(40),
            key: "ArrowDown",
            code: "ArrowDown",
            text: None,
            shift_key: None,
            shift_text: None,
            location: None,
        }),
        "Shift" | "ShiftLeft" => Some(KeyDefinition {
            key_code: Some(16),
            key: "Shift",
            code: "ShiftLeft",
            text: None,
            shift_key: None,
            shift_text: None,
            location: Some(1),
        }),
        "ShiftRight" => Some(KeyDefinition {
            key_code: Some(16),
            key: "Shift",
            code: "ShiftRight",
            text: None,
            shift_key: None,
            shift_text: None,
            location: Some(2),
        }),
        "Control" | "ControlLeft" => Some(KeyDefinition {
            key_code: Some(17),
            key: "Control",
            code: "ControlLeft",
            text: None,
            shift_key: None,
            shift_text: None,
            location: Some(1),
        }),
        "ControlRight" => Some(KeyDefinition {
            key_code: Some(17),
            key: "Control",
            code: "ControlRight",
            text: None,
            shift_key: None,
            shift_text: None,
            location: Some(2),
        }),
        "Alt" | "AltLeft" => Some(KeyDefinition {
            key_code: Some(18),
            key: "Alt",
            code: "AltLeft",
            text: None,
            shift_key: None,
            shift_text: None,
            location: Some(1),
        }),
        "AltRight" => Some(KeyDefinition {
            key_code: Some(18),
            key: "Alt",
            code: "AltRight",
            text: None,
            shift_key: None,
            shift_text: None,
            location: Some(2),
        }),
        "Meta" | "MetaLeft" => Some(KeyDefinition {
            key_code: Some(91),
            key: "Meta",
            code: "MetaLeft",
            text: None,
            shift_key: None,
            shift_text: None,
            location: Some(1),
        }),
        "MetaRight" => Some(KeyDefinition {
            key_code: Some(92),
            key: "Meta",
            code: "MetaRight",
            text: None,
            shift_key: None,
            shift_text: None,
            location: Some(2),
        }),
        "Space" | " " => Some(KeyDefinition {
            key_code: Some(32),
            key: " ",
            code: "Space",
            text: Some(" "),
            shift_key: None,
            shift_text: None,
            location: None,
        }),
        "F1" => Some(function_key("F1", 112)),
        "F2" => Some(function_key("F2", 113)),
        "F3" => Some(function_key("F3", 114)),
        "F4" => Some(function_key("F4", 115)),
        "F5" => Some(function_key("F5", 116)),
        "F6" => Some(function_key("F6", 117)),
        "F7" => Some(function_key("F7", 118)),
        "F8" => Some(function_key("F8", 119)),
        "F9" => Some(function_key("F9", 120)),
        "F10" => Some(function_key("F10", 121)),
        "F11" => Some(function_key("F11", 122)),
        "F12" => Some(function_key("F12", 123)),
        _ => from_printable(key),
    }
}

fn function_key(name: &'static str, key_code: i64) -> KeyDefinition {
    KeyDefinition {
        key_code: Some(key_code),
        key: name,
        code: name,
        text: None,
        shift_key: None,
        shift_text: None,
        location: None,
    }
}

fn from_printable(key: &str) -> Option<KeyDefinition> {
    match key {
        "a" | "A" | "KeyA" => Some(letter("a", "A", "KeyA", 65)),
        "b" | "B" | "KeyB" => Some(letter("b", "B", "KeyB", 66)),
        "c" | "C" | "KeyC" => Some(letter("c", "C", "KeyC", 67)),
        "d" | "D" | "KeyD" => Some(letter("d", "D", "KeyD", 68)),
        "e" | "E" | "KeyE" => Some(letter("e", "E", "KeyE", 69)),
        "f" | "F" | "KeyF" => Some(letter("f", "F", "KeyF", 70)),
        "g" | "G" | "KeyG" => Some(letter("g", "G", "KeyG", 71)),
        "h" | "H" | "KeyH" => Some(letter("h", "H", "KeyH", 72)),
        "i" | "I" | "KeyI" => Some(letter("i", "I", "KeyI", 73)),
        "j" | "J" | "KeyJ" => Some(letter("j", "J", "KeyJ", 74)),
        "k" | "K" | "KeyK" => Some(letter("k", "K", "KeyK", 75)),
        "l" | "L" | "KeyL" => Some(letter("l", "L", "KeyL", 76)),
        "m" | "M" | "KeyM" => Some(letter("m", "M", "KeyM", 77)),
        "n" | "N" | "KeyN" => Some(letter("n", "N", "KeyN", 78)),
        "o" | "O" | "KeyO" => Some(letter("o", "O", "KeyO", 79)),
        "p" | "P" | "KeyP" => Some(letter("p", "P", "KeyP", 80)),
        "q" | "Q" | "KeyQ" => Some(letter("q", "Q", "KeyQ", 81)),
        "r" | "R" | "KeyR" => Some(letter("r", "R", "KeyR", 82)),
        "s" | "S" | "KeyS" => Some(letter("s", "S", "KeyS", 83)),
        "t" | "T" | "KeyT" => Some(letter("t", "T", "KeyT", 84)),
        "u" | "U" | "KeyU" => Some(letter("u", "U", "KeyU", 85)),
        "v" | "V" | "KeyV" => Some(letter("v", "V", "KeyV", 86)),
        "w" | "W" | "KeyW" => Some(letter("w", "W", "KeyW", 87)),
        "x" | "X" | "KeyX" => Some(letter("x", "X", "KeyX", 88)),
        "y" | "Y" | "KeyY" => Some(letter("y", "Y", "KeyY", 89)),
        "z" | "Z" | "KeyZ" => Some(letter("z", "Z", "KeyZ", 90)),
        "0" | ")" | "Digit0" => Some(digit("0", ")", "Digit0", 48)),
        "1" | "!" | "Digit1" => Some(digit("1", "!", "Digit1", 49)),
        "2" | "@" | "Digit2" => Some(digit("2", "@", "Digit2", 50)),
        "3" | "#" | "Digit3" => Some(digit("3", "#", "Digit3", 51)),
        "4" | "$" | "Digit4" => Some(digit("4", "$", "Digit4", 52)),
        "5" | "%" | "Digit5" => Some(digit("5", "%", "Digit5", 53)),
        "6" | "^" | "Digit6" => Some(digit("6", "^", "Digit6", 54)),
        "7" | "&" | "Digit7" => Some(digit("7", "&", "Digit7", 55)),
        "8" | "*" | "Digit8" => Some(digit("8", "*", "Digit8", 56)),
        "9" | "(" | "Digit9" => Some(digit("9", "(", "Digit9", 57)),
        ";" | ":" | "Semicolon" => Some(symbol(";", ":", "Semicolon", 186)),
        "=" | "+" | "Equal" => Some(symbol("=", "+", "Equal", 187)),
        "," | "<" | "Comma" => Some(symbol(",", "<", "Comma", 188)),
        "-" | "_" | "Minus" => Some(symbol("-", "_", "Minus", 189)),
        "." | ">" | "Period" => Some(symbol(".", ">", "Period", 190)),
        "/" | "?" | "Slash" => Some(symbol("/", "?", "Slash", 191)),
        "`" | "~" | "Backquote" => Some(symbol("`", "~", "Backquote", 192)),
        "[" | "{" | "BracketLeft" => Some(symbol("[", "{", "BracketLeft", 219)),
        "\\" | "|" | "Backslash" => Some(symbol("\\", "|", "Backslash", 220)),
        "]" | "}" | "BracketRight" => Some(symbol("]", "}", "BracketRight", 221)),
        "'" | "\"" | "Quote" => Some(symbol("'", "\"", "Quote", 222)),
        _ => None,
    }
}

fn letter(
    key: &'static str,
    shift_key: &'static str,
    code: &'static str,
    key_code: i64,
) -> KeyDefinition {
    KeyDefinition {
        key_code: Some(key_code),
        key,
        code,
        text: Some(key),
        shift_key: Some(shift_key),
        shift_text: Some(shift_key),
        location: None,
    }
}

fn digit(
    key: &'static str,
    shift_key: &'static str,
    code: &'static str,
    key_code: i64,
) -> KeyDefinition {
    KeyDefinition {
        key_code: Some(key_code),
        key,
        code,
        text: Some(key),
        shift_key: Some(shift_key),
        shift_text: Some(shift_key),
        location: None,
    }
}

fn symbol(
    key: &'static str,
    shift_key: &'static str,
    code: &'static str,
    key_code: i64,
) -> KeyDefinition {
    KeyDefinition {
        key_code: Some(key_code),
        key,
        code,
        text: Some(key),
        shift_key: Some(shift_key),
        shift_text: Some(shift_key),
        location: None,
    }
}