48 lines
1.5 KiB
Rust
48 lines
1.5 KiB
Rust
|
|
// tools/write.rs — Write file contents
|
||
|
|
|
||
|
|
use anyhow::{Context, Result};
|
||
|
|
use serde_json::json;
|
||
|
|
use std::path::Path;
|
||
|
|
|
||
|
|
use crate::types::ToolDef;
|
||
|
|
|
||
|
|
pub fn definition() -> ToolDef {
|
||
|
|
ToolDef::new(
|
||
|
|
"write_file",
|
||
|
|
"Write content to a file. Creates the file if it doesn't exist, \
|
||
|
|
overwrites if it does. Creates parent directories as needed.",
|
||
|
|
json!({
|
||
|
|
"type": "object",
|
||
|
|
"properties": {
|
||
|
|
"file_path": {
|
||
|
|
"type": "string",
|
||
|
|
"description": "Absolute path to the file to write"
|
||
|
|
},
|
||
|
|
"content": {
|
||
|
|
"type": "string",
|
||
|
|
"description": "The content to write to the file"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"required": ["file_path", "content"]
|
||
|
|
}),
|
||
|
|
)
|
||
|
|
}
|
||
|
|
|
||
|
|
pub fn write_file(args: &serde_json::Value) -> Result<String> {
|
||
|
|
let path = args["file_path"]
|
||
|
|
.as_str()
|
||
|
|
.context("file_path is required")?;
|
||
|
|
let content = args["content"].as_str().context("content is required")?;
|
||
|
|
|
||
|
|
// Create parent directories if needed
|
||
|
|
if let Some(parent) = Path::new(path).parent() {
|
||
|
|
std::fs::create_dir_all(parent)
|
||
|
|
.with_context(|| format!("Failed to create directories for {}", path))?;
|
||
|
|
}
|
||
|
|
|
||
|
|
std::fs::write(path, content).with_context(|| format!("Failed to write {}", path))?;
|
||
|
|
|
||
|
|
let line_count = content.lines().count();
|
||
|
|
Ok(format!("Wrote {} lines to {}", line_count, path))
|
||
|
|
}
|