45 lines
1.1 KiB
Rust
45 lines
1.1 KiB
Rust
//! Read a file from the workspace.
|
|||
|
|
|
||
|
|
use crate::tools::{resolve_path, Tool, ToolCtx};
|
||
|
|
use anyhow::Result;
|
||
|
|
use serde_json::{json, Value};
|
||
|
|
use std::fs;
|
||
|
|
|
||
|
|
pub struct Read;
|
||
|
|
|
||
|
|
impl Tool for Read {
|
||
|
|
fn name(&self) -> &'static str {
|
||
|
|
"read"
|
||
|
|
}
|
||
|
|
|
||
|
|
fn description(&self) -> &'static str {
|
||
|
|
"Read the contents of a file"
|
||
|
|
}
|
||
|
|
|
||
|
|
fn parameters(&self) -> Value {
|
||
|
|
json!({
|
||
|
|
"type": "object",
|
||
|
|
"properties": {
|
||
|
|
"path": {
|
||
|
|
"type": "string",
|
||
|
|
"description": "Path to the file to read (relative to workspace root)"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"required": ["path"]
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
fn run(&self, ctx: &ToolCtx, args: &Value) -> Result<String> {
|
||
|
|
let rel = crate::tools::arg_str(args, "path")?;
|
||
|
|
let path = resolve_path(&ctx.workspaces, &rel)?;
|
||
|
|
if !path.exists() {
|
||
|
|
anyhow::bail!("file '{rel}' does not exist");
|
||
|
|
}
|
||
|
|
if !path.is_file() {
|
||
|
|
anyhow::bail!("'{rel}' is not a file");
|
||
|
|
}
|
||
|
|
let content = fs::read_to_string(&path)?;
|
||
|
|
Ok(content)
|
||
|
|
}
|
||
|
|
}
|