playwright_rs/protocol/
tap.rs1use crate::protocol::click::{KeyboardModifier, Position};
7
8#[derive(Debug, Clone, Default)]
32#[non_exhaustive]
33pub struct TapOptions {
34 pub force: Option<bool>,
36 pub modifiers: Option<Vec<KeyboardModifier>>,
38 pub position: Option<Position>,
40 pub timeout: Option<f64>,
42 pub trial: Option<bool>,
44}
45
46impl TapOptions {
47 pub fn builder() -> TapOptionsBuilder {
49 TapOptionsBuilder::default()
50 }
51
52 pub(crate) fn to_json(&self) -> serde_json::Value {
54 let mut json = serde_json::json!({});
55
56 if let Some(force) = self.force {
57 json["force"] = serde_json::json!(force);
58 }
59
60 if let Some(modifiers) = &self.modifiers {
61 json["modifiers"] =
62 serde_json::to_value(modifiers).expect("serialization of modifiers cannot fail");
63 }
64
65 if let Some(position) = &self.position {
66 json["position"] =
67 serde_json::to_value(position).expect("serialization of position cannot fail");
68 }
69
70 if let Some(timeout) = self.timeout {
72 json["timeout"] = serde_json::json!(timeout);
73 } else {
74 json["timeout"] = serde_json::json!(crate::DEFAULT_TIMEOUT_MS);
75 }
76
77 if let Some(trial) = self.trial {
78 json["trial"] = serde_json::json!(trial);
79 }
80
81 json
82 }
83}
84
85#[derive(Debug, Clone, Default)]
89pub struct TapOptionsBuilder {
90 force: Option<bool>,
91 modifiers: Option<Vec<KeyboardModifier>>,
92 position: Option<Position>,
93 timeout: Option<f64>,
94 trial: Option<bool>,
95}
96
97impl TapOptionsBuilder {
98 pub fn force(mut self, force: bool) -> Self {
100 self.force = Some(force);
101 self
102 }
103
104 pub fn modifiers(mut self, modifiers: Vec<KeyboardModifier>) -> Self {
106 self.modifiers = Some(modifiers);
107 self
108 }
109
110 pub fn position(mut self, position: Position) -> Self {
112 self.position = Some(position);
113 self
114 }
115
116 pub fn timeout(mut self, timeout: f64) -> Self {
118 self.timeout = Some(timeout);
119 self
120 }
121
122 pub fn trial(mut self, trial: bool) -> Self {
124 self.trial = Some(trial);
125 self
126 }
127
128 pub fn build(self) -> TapOptions {
130 TapOptions {
131 force: self.force,
132 modifiers: self.modifiers,
133 position: self.position,
134 timeout: self.timeout,
135 trial: self.trial,
136 }
137 }
138}
139
140#[cfg(test)]
141mod tests {
142 use super::*;
143
144 #[test]
145 fn test_tap_options_default() {
146 let options = TapOptions::builder().build();
147 let json = options.to_json();
148 assert!(json["timeout"].is_number());
150 assert!(json.get("force").is_none());
152 assert!(json.get("trial").is_none());
153 }
154
155 #[test]
156 fn test_tap_options_force() {
157 let options = TapOptions::builder().force(true).build();
158 let json = options.to_json();
159 assert_eq!(json["force"], true);
160 }
161
162 #[test]
163 fn test_tap_options_timeout() {
164 let options = TapOptions::builder().timeout(5000.0).build();
165 let json = options.to_json();
166 assert_eq!(json["timeout"], 5000.0);
167 }
168
169 #[test]
170 fn test_tap_options_trial() {
171 let options = TapOptions::builder().trial(true).build();
172 let json = options.to_json();
173 assert_eq!(json["trial"], true);
174 }
175
176 #[test]
177 fn test_tap_options_position() {
178 let options = TapOptions::builder()
179 .position(Position { x: 10.0, y: 20.0 })
180 .build();
181 let json = options.to_json();
182 assert_eq!(json["position"]["x"], 10.0);
183 assert_eq!(json["position"]["y"], 20.0);
184 }
185}