use serde::Serialize;
use crate::cdp::Cdp;
use crate::cdp::command::{CdpCommand, Empty};
use crate::common::protocol::string_enum;
use crate::error::WebDriverResult;
string_enum! {
pub enum KeyEventType {
KeyDown = "keyDown",
KeyUp = "keyUp",
RawKeyDown = "rawKeyDown",
Char = "char",
}
}
string_enum! {
pub enum MouseEventType {
MousePressed = "mousePressed",
MouseReleased = "mouseReleased",
MouseMoved = "mouseMoved",
MouseWheel = "mouseWheel",
}
}
string_enum! {
pub enum MouseButton {
None = "none",
Left = "left",
Middle = "middle",
Right = "right",
Back = "back",
Forward = "forward",
}
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DispatchKeyEvent {
pub r#type: KeyEventType,
#[serde(skip_serializing_if = "Option::is_none")]
pub modifiers: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub unmodified_text: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub native_virtual_key_code: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub windows_virtual_key_code: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub auto_repeat: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_keypad: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_system_key: Option<bool>,
}
impl CdpCommand for DispatchKeyEvent {
const METHOD: &'static str = "Input.dispatchKeyEvent";
type Returns = Empty;
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DispatchMouseEvent {
pub r#type: MouseEventType,
pub x: f64,
pub y: f64,
#[serde(skip_serializing_if = "Option::is_none")]
pub modifiers: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub button: Option<MouseButton>,
#[serde(skip_serializing_if = "Option::is_none")]
pub click_count: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub delta_x: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub delta_y: Option<f64>,
}
impl CdpCommand for DispatchMouseEvent {
const METHOD: &'static str = "Input.dispatchMouseEvent";
type Returns = Empty;
}
#[derive(Debug, Clone, Serialize)]
pub struct InsertText {
pub text: String,
}
impl CdpCommand for InsertText {
const METHOD: &'static str = "Input.insertText";
type Returns = Empty;
}
#[derive(Debug)]
pub struct InputDomain<'a> {
cdp: &'a Cdp,
}
impl<'a> InputDomain<'a> {
pub(crate) fn new(cdp: &'a Cdp) -> Self {
Self {
cdp,
}
}
pub async fn insert_text(&self, text: impl Into<String>) -> WebDriverResult<()> {
self.cdp
.send(InsertText {
text: text.into(),
})
.await?;
Ok(())
}
}