use std::time::Duration;
use serde_json::{Value, json};
use webdriver::error::{ErrorStatus, WebDriverError, WebDriverResult};
pub(crate) const DEFAULT_SCRIPT_TIMEOUT: u64 = 30_000;
pub(crate) const DEFAULT_PAGE_LOAD_TIMEOUT: u64 = 300_000;
pub(crate) const DEFAULT_IMPLICIT_WAIT: u64 = 0;
pub(crate) const SCREENSHOT_TIMEOUT: Duration = Duration::from_secs(10);
pub(crate) struct TimeoutsConfiguration {
pub(crate) script: Option<u64>,
pub(crate) page_load: Option<u64>,
pub(crate) implicit_wait: Option<u64>,
pub(crate) sleep_interval: u64,
}
impl Default for TimeoutsConfiguration {
fn default() -> Self {
TimeoutsConfiguration {
script: Some(DEFAULT_SCRIPT_TIMEOUT),
page_load: Some(DEFAULT_PAGE_LOAD_TIMEOUT),
implicit_wait: Some(DEFAULT_IMPLICIT_WAIT),
sleep_interval: 10,
}
}
}
pub(crate) fn deserialize_as_timeouts_configuration(
timeouts: &Value,
) -> WebDriverResult<TimeoutsConfiguration> {
if let Value::Object(map) = timeouts {
let mut config = TimeoutsConfiguration::default();
for (key, value) in map {
let target = match key.as_str() {
"implicit" => &mut config.implicit_wait,
"pageLoad" => &mut config.page_load,
"script" => &mut config.script,
_ => continue,
};
*target = match value {
Value::Null => None,
Value::Number(num) => Some(
num.as_f64()
.expect("Number already validated when parsing requests")
as u64,
),
_ => unreachable!("This has been validated when parsing requests"),
};
}
Ok(config)
} else {
Err(WebDriverError::new(
ErrorStatus::InvalidArgument,
"Expected an object for timeouts",
))
}
}
pub(crate) fn serialize_timeouts_configuration(timeouts: &TimeoutsConfiguration) -> Value {
json!({
"script": timeouts.script,
"pageLoad": timeouts.page_load,
"implicit": timeouts.implicit_wait,
})
}