use serde_json::{json, Value};
use crate::cdp::client::CdpClient;
use crate::cdp::types::EvaluateResult;
pub async fn run_raw(
client: &CdpClient,
expression: &str,
) -> Result<Value, crate::BoxError> {
let result: EvaluateResult = client
.call(
"Runtime.evaluate",
json!({
"expression": expression,
"returnByValue": true,
"awaitPromise": true,
}),
)
.await?;
if let Some(exception) = &result.exception_details {
return Err(format!(
"Evaluation error: {}",
exception
.exception
.as_ref()
.and_then(|e| e.description.as_deref())
.unwrap_or(&exception.text)
)
.into());
}
Ok(result.result.value.unwrap_or_default())
}
pub async fn run(
client: &CdpClient,
expression: &str,
) -> Result<String, crate::BoxError> {
let result: EvaluateResult = client
.call(
"Runtime.evaluate",
json!({
"expression": expression,
"returnByValue": true,
"awaitPromise": true,
}),
)
.await?;
if let Some(exception) = &result.exception_details {
return Err(format!(
"Evaluation error: {}",
exception
.exception
.as_ref()
.and_then(|e| e.description.as_deref())
.unwrap_or(&exception.text)
)
.into());
}
let output = match &result.result.value {
Some(val) => serde_json::to_string(val)?,
None => {
result
.result
.description
.clone()
.unwrap_or_else(|| result.result.remote_type.clone())
}
};
Ok(output)
}