use crate::error::Result;
use crate::tools::utils::validate_navigation_url;
use crate::tools::{
DocumentEnvelopeOptions, Tool, ToolContext, ToolResult, build_document_envelope,
};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct NavigateParams {
pub url: String,
#[serde(default = "default_wait")]
pub wait_for_load: bool,
#[serde(default)]
pub allow_unsafe: bool,
}
fn default_wait() -> bool {
true
}
#[derive(Default)]
pub struct NavigateTool;
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct NavigateOutput {
#[serde(flatten)]
pub envelope: crate::tools::DocumentEnvelope,
pub action: String,
pub url: String,
}
impl Tool for NavigateTool {
type Params = NavigateParams;
type Output = NavigateOutput;
fn name(&self) -> &str {
"navigate"
}
fn execute_typed(
&self,
params: NavigateParams,
context: &mut ToolContext,
) -> Result<ToolResult> {
let normalized_url = validate_navigation_url(¶ms.url, params.allow_unsafe)?;
context.session.navigate(&normalized_url)?;
if params.wait_for_load {
context.session.wait_for_navigation()?;
}
context.invalidate_dom();
Ok(ToolResult::success_with(NavigateOutput {
envelope: build_document_envelope(context, None, DocumentEnvelopeOptions::minimal())?,
action: "navigate".to_string(),
url: normalized_url,
}))
}
}