pebbles 0.0.101

A unfinished webautomation framework for working with Firefox and the geckodriver.
Documentation
use crate::{
    result::PebblesError,
    Service,
};
use rand::Rng;
use serde_json::json;
use std::rc::Rc;
use std::fmt;

pub struct Keyboard {
    service: Rc<Service>,
}

impl Keyboard {
    pub fn new(service: Rc<Service>) -> Self {
        Keyboard {
            service,
        }
    }

    pub fn down(&self, key:&str) -> Result<(), PebblesError> {
        let actions = json!({"actions":[
            {
                "type": "key",
                "id": "key",
                "actions": [{
                    "type": "keyDown",
                    "value": key
                }]
            }
        ]});
        self.service.post("/actions", &actions)?;
        Ok(())
    }

    pub fn up(&self, key:&str) -> Result<(), PebblesError> {
        let actions = json!({"actions":[
            {
                "type": "key",
                "id": "key",
                "actions": [{
                    "type": "keyUp",
                    "value": key
                }]
            }
        ]});
        self.service.post("/actions", &actions)?;
        Ok(())
    }

    pub fn type_keys(&self, keys:&str) -> Result<(), PebblesError> {
        let mut rng = rand::thread_rng();
        let max_pause: i32 = 120;
        let min_pause: i32 = 50;
        let mut pause_duration: i32 = rng.gen_range(min_pause..max_pause);
        let mut actions = json!({"actions":[
            {
                "type": "key",
                "id": "key",
                "actions": []
            }
        ]});
        for key in keys.chars() {
            if rng.gen_range(1..3) == 1 {
                pause_duration = rng.gen_range(min_pause..max_pause);
            }
            let new_action = vec![
                json!({
                    "type": "keyDown",
                    "value": key
                }),
                json!({
                    "type": "pause",
                    "duration": pause_duration
                }),
                json!({
                    "type": "keyUp",
                    "value": key
                }),
                json!({
                    "type": "pause",
                    "duration": if key != ' ' {pause_duration} else {(pause_duration as f32 * rng.gen_range(1.0..3.0)) as i32}
                })
            ];
            if let Some(actions_array) = actions["actions"][0]["actions"].as_array_mut() {
                actions_array.extend(new_action);
            }
        }
        self.service.post("/actions", &actions)?;
        Ok(())
    }
}

pub enum Keys {
    Null,
    Cancel,
    Help,
    BackSpace,
    Tab,
    Clear,
    Return,
    Enter,
    Shift,
    Control,
    Alt,
    Pause,
    Escape,
    Space,
    PageUp,
    PageDown,
    End,
    Home,
    Left,
    Up,
    Right,
    Down,
    Insert,
    Delete,
    Semicolon,
    Equals,
    // Number pad keys
    Numpad0,
    Numpad1,
    Numpad2,
    Numpad3,
    Numpad4,
    Numpad5,
    Numpad6,
    Numpad7,
    Numpad8,
    Numpad9,
    Multiply,
    Add,
    Separator,
    Subtract,
    Decimal,
    Divide,
    // Function keys
    F1,
    F2,
    F3,
    F4,
    F5,
    F6,
    F7,
    F8,
    F9,
    F10,
    F11,
    F12,
    Meta,
    Command,
    // I wanted to know too: https://en.wikipedia.org/wiki/Language_input_keys
    ZenkakuHankaku,
}

impl fmt::Display for Keys {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            Keys::Null => write!(f, "\u{e000}"),
            Keys::Cancel => write!(f, "\u{e001}"),
            Keys::Help => write!(f, "\u{e002}"),
            Keys::BackSpace => write!(f, "\u{e003}"),
            Keys::Tab => write!(f, "\u{e004}"),
            Keys::Clear => write!(f, "\u{e005}"),
            Keys::Return => write!(f, "\u{e006}"),
            Keys::Enter => write!(f, "\u{e007}"),
            Keys::Shift => write!(f, "\u{e008}"),
            Keys::Control => write!(f, "\u{e009}"),
            Keys::Alt => write!(f, "\u{e00a}"),
            Keys::Pause => write!(f, "\u{e00b}"),
            Keys::Escape => write!(f, "\u{e00c}"),
            Keys::Space => write!(f, "\u{e00d}"),
            Keys::PageUp => write!(f, "\u{e00e}"),
            Keys::PageDown => write!(f, "\u{e00f}"),
            Keys::End => write!(f, "\u{e010}"),
            Keys::Home => write!(f, "\u{e011}"),
            Keys::Left => write!(f, "\u{e012}"),
            Keys::Up => write!(f, "\u{e013}"),
            Keys::Right => write!(f, "\u{e014}"),
            Keys::Down => write!(f, "\u{e015}"),
            Keys::Insert => write!(f, "\u{e016}"),
            Keys::Delete => write!(f, "\u{e017}"),
            Keys::Semicolon => write!(f, "\u{e018}"),
            Keys::Equals => write!(f, "\u{e019}"),

            // Number pad keys
            Keys::Numpad0 => write!(f, "\u{e01a}"),
            Keys::Numpad1 => write!(f, "\u{e01b}"),
            Keys::Numpad2 => write!(f, "\u{e01c}"),
            Keys::Numpad3 => write!(f, "\u{e01d}"),
            Keys::Numpad4 => write!(f, "\u{e01e}"),
            Keys::Numpad5 => write!(f, "\u{e01f}"),
            Keys::Numpad6 => write!(f, "\u{e020}"),
            Keys::Numpad7 => write!(f, "\u{e021}"),
            Keys::Numpad8 => write!(f, "\u{e022}"),
            Keys::Numpad9 => write!(f, "\u{e023}"),
            Keys::Multiply => write!(f, "\u{e024}"),
            Keys::Add => write!(f, "\u{e025}"),
            Keys::Separator => write!(f, "\u{e026}"),
            Keys::Subtract => write!(f, "\u{e027}"),
            Keys::Decimal => write!(f, "\u{e028}"),
            Keys::Divide => write!(f, "\u{e029}"),

            // Function keys
            Keys::F1 => write!(f, "\u{e031}"),
            Keys::F2 => write!(f, "\u{e032}"),
            Keys::F3 => write!(f, "\u{e033}"),
            Keys::F4 => write!(f, "\u{e034}"),
            Keys::F5 => write!(f, "\u{e035}"),
            Keys::F6 => write!(f, "\u{e036}"),
            Keys::F7 => write!(f, "\u{e037}"),
            Keys::F8 => write!(f, "\u{e038}"),
            Keys::F9 => write!(f, "\u{e039}"),
            Keys::F10 => write!(f, "\u{e03a}"),
            Keys::F11 => write!(f, "\u{e03b}"),
            Keys::F12 => write!(f, "\u{e03c}"),
            
            Keys::Meta => write!(f, "\u{e03d}"),
            Keys::Command => write!(f, "\u{e03d}"),
            Keys::ZenkakuHankaku => write!(f, "\u{e040}"),
        }
    }
}