62 lines
1.4 KiB
Rust
62 lines
1.4 KiB
Rust
//! Web fetch tool
|
|
|
|
use async_trait::async_trait;
|
|
use serde_json::{json, Value};
|
|
use zclaw_types::{Result, ZclawError};
|
|
|
|
use crate::tool::{Tool, ToolContext};
|
|
|
|
pub struct WebFetchTool;
|
|
|
|
impl WebFetchTool {
|
|
pub fn new() -> Self {
|
|
Self
|
|
}
|
|
}
|
|
|
|
#[async_trait]
|
|
impl Tool for WebFetchTool {
|
|
fn name(&self) -> &str {
|
|
"web_fetch"
|
|
}
|
|
|
|
fn description(&self) -> &str {
|
|
"Fetch content from a URL"
|
|
}
|
|
|
|
fn input_schema(&self) -> Value {
|
|
json!({
|
|
"type": "object",
|
|
"properties": {
|
|
"url": {
|
|
"type": "string",
|
|
"description": "The URL to fetch"
|
|
},
|
|
"method": {
|
|
"type": "string",
|
|
"enum": ["GET", "POST"],
|
|
"description": "HTTP method (default: GET)"
|
|
}
|
|
},
|
|
"required": ["url"]
|
|
})
|
|
}
|
|
|
|
async fn execute(&self, input: Value, _context: &ToolContext) -> Result<Value> {
|
|
let url = input["url"].as_str()
|
|
.ok_or_else(|| ZclawError::InvalidInput("Missing 'url' parameter".into()))?;
|
|
|
|
// TODO: Implement actual web fetching with SSRF protection
|
|
Ok(json!({
|
|
"status": 200,
|
|
"content": format!("Fetched content placeholder for: {}", url)
|
|
}))
|
|
}
|
|
}
|
|
|
|
impl Default for WebFetchTool {
|
|
fn default() -> Self {
|
|
Self::new()
|
|
}
|
|
}
|