use crate::protocol::click::{KeyboardModifier, Position};
#[derive(Debug, Clone, Default, serde::Serialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct TapOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub force: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub modifiers: Option<Vec<KeyboardModifier>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub position: Option<Position>,
#[serde(serialize_with = "crate::protocol::serialize_timeout_or_default")]
pub timeout: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub trial: Option<bool>,
}
impl TapOptions {
pub fn builder() -> TapOptionsBuilder {
TapOptionsBuilder::default()
}
pub(crate) fn to_json(&self) -> serde_json::Value {
serde_json::to_value(self).expect("TapOptions serialization cannot fail")
}
}
#[derive(Debug, Clone, Default)]
pub struct TapOptionsBuilder {
force: Option<bool>,
modifiers: Option<Vec<KeyboardModifier>>,
position: Option<Position>,
timeout: Option<f64>,
trial: Option<bool>,
}
impl TapOptionsBuilder {
pub fn force(mut self, force: bool) -> Self {
self.force = Some(force);
self
}
pub fn modifiers(mut self, modifiers: Vec<KeyboardModifier>) -> Self {
self.modifiers = Some(modifiers);
self
}
pub fn position(mut self, position: Position) -> Self {
self.position = Some(position);
self
}
pub fn timeout(mut self, timeout: f64) -> Self {
self.timeout = Some(timeout);
self
}
pub fn trial(mut self, trial: bool) -> Self {
self.trial = Some(trial);
self
}
pub fn build(self) -> TapOptions {
TapOptions {
force: self.force,
modifiers: self.modifiers,
position: self.position,
timeout: self.timeout,
trial: self.trial,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_tap_options_default() {
let options = TapOptions::builder().build();
let json = options.to_json();
assert!(json["timeout"].is_number());
assert!(json.get("force").is_none());
assert!(json.get("trial").is_none());
}
#[test]
fn test_tap_options_force() {
let options = TapOptions::builder().force(true).build();
let json = options.to_json();
assert_eq!(json["force"], true);
}
#[test]
fn test_tap_options_timeout() {
let options = TapOptions::builder().timeout(5000.0).build();
let json = options.to_json();
assert_eq!(json["timeout"], 5000.0);
}
#[test]
fn test_tap_options_trial() {
let options = TapOptions::builder().trial(true).build();
let json = options.to_json();
assert_eq!(json["trial"], true);
}
#[test]
fn test_tap_options_position() {
let options = TapOptions::builder()
.position(Position { x: 10.0, y: 20.0 })
.build();
let json = options.to_json();
assert_eq!(json["position"]["x"], 10.0);
assert_eq!(json["position"]["y"], 20.0);
}
}