use crate::{Axis, Button, Coordinate, Direction, Enigo, InputResult, Key, Keyboard, Mouse};
use log::error;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum Token {
#[cfg_attr(feature = "serde", serde(alias = "T"))]
#[cfg_attr(feature = "serde", serde(alias = "t"))]
Text(String),
#[cfg_attr(feature = "serde", serde(alias = "K"))]
#[cfg_attr(feature = "serde", serde(alias = "k"))]
Key(
Key,
#[cfg_attr(feature = "serde", serde(default))] Direction,
),
#[cfg_attr(feature = "serde", serde(alias = "R"))]
#[cfg_attr(feature = "serde", serde(alias = "r"))]
Raw(
u16,
#[cfg_attr(feature = "serde", serde(default))] Direction,
),
#[cfg_attr(feature = "serde", serde(alias = "B"))]
#[cfg_attr(feature = "serde", serde(alias = "b"))]
Button(
Button,
#[cfg_attr(feature = "serde", serde(default))] Direction,
),
#[cfg_attr(feature = "serde", serde(alias = "M"))]
#[cfg_attr(feature = "serde", serde(alias = "m"))]
MoveMouse(
i32,
i32,
#[cfg_attr(feature = "serde", serde(default))] Coordinate,
),
#[cfg_attr(feature = "serde", serde(alias = "S"))]
#[cfg_attr(feature = "serde", serde(alias = "s"))]
Scroll(i32, #[cfg_attr(feature = "serde", serde(default))] Axis),
#[cfg(all(feature = "platform_specific", target_os = "macos"))]
#[cfg_attr(feature = "serde", serde(alias = "SS"))]
#[cfg_attr(feature = "serde", serde(alias = "ss"))]
SmoothScroll(i32, #[cfg_attr(feature = "serde", serde(default))] Axis),
#[cfg_attr(feature = "serde", serde(alias = "L"))]
#[cfg_attr(feature = "serde", serde(alias = "l"))]
Location(i32, i32),
#[cfg_attr(feature = "serde", serde(alias = "D"))]
#[cfg_attr(feature = "serde", serde(alias = "d"))]
MainDisplay(i32, i32),
}
pub trait Agent
where
Self: Keyboard,
Self: Mouse,
{
fn execute(&mut self, token: &Token) -> InputResult<()> {
match token {
Token::Text(text) => self.text(text),
Token::Key(key, direction) => self.key(*key, *direction),
Token::Raw(keycode, direction) => self.raw(*keycode, *direction),
Token::Button(button, direction) => self.button(*button, *direction),
Token::MoveMouse(x, y, coordinate) => self.move_mouse(*x, *y, *coordinate),
Token::Scroll(length, axis) => self.scroll(*length, *axis),
#[cfg(all(feature = "platform_specific", target_os = "macos"))]
Token::SmoothScroll(length, axis) => self.smooth_scroll(*length, *axis),
Token::Location(expected_x, expected_y) => match self.location() {
Ok((actual_x, actual_y)) => {
if actual_x != *expected_x || actual_y != *expected_y {
error!("The mouse is not at the expected location");
}
Ok(())
}
Err(e) => {
error!("There was an error getting the location of the mouse");
Err(e)
}
},
Token::MainDisplay(expected_width, expected_height) => match self.main_display() {
Ok((actual_x, actual_y)) => {
if actual_x != *expected_width || actual_y != *expected_height {
error!("The size of the main display is not what was expected");
}
Ok(())
}
Err(e) => {
error!("There was an error getting the size of the main display");
Err(e)
}
},
}
}
}
impl Agent for Enigo {}