use super::*;
use crate::tool_primitives::fs as pfs;
use serde::Deserialize;
pub struct FileWriteTool;
#[async_trait]
impl Tool for FileWriteTool {
fn name(&self) -> &str {
"Write"
}
fn description(&self) -> &str {
"Write content to a file, creating it if it doesn't exist."
}
fn permission_level(&self) -> PermissionLevel {
PermissionLevel::Write
}
fn category(&self) -> ToolCategory {
ToolCategory::FileSystem
}
fn input_schema(&self) -> Value {
serde_json::json!({
"type": "object",
"properties": {
"file_path": { "type": "string", "description": "Absolute path to the file" },
"content": { "type": "string", "description": "Content to write" }
},
"required": ["file_path", "content"]
})
}
async fn execute(&self, input: Value, _ctx: &ToolContext) -> ToolResult {
#[derive(Deserialize)]
struct Input {
file_path: String,
content: String,
}
let input: Input = match serde_json::from_value(input) {
Ok(i) => i,
Err(e) => return ToolResult::error(format!("Invalid input: {}", e)),
};
let path = std::path::Path::new(&input.file_path);
match pfs::write_file(path, &input.content).await {
Ok(()) => {
ToolResult::success(format!("File created successfully at: {}", input.file_path))
}
Err(e) => ToolResult::error(format!("Failed to write file: {}", e)),
}
}
}