soma_codemode/snippet/
io.rs1use std::path::{Path, PathBuf};
2
3use crate::path_safety::reject_path_traversal;
4use crate::ToolError;
5
6pub fn snippet_path(root: &Path, rel_path: &str) -> Result<PathBuf, ToolError> {
7 reject_path_traversal(rel_path)?;
8 Ok(root.join(rel_path))
9}
10
11pub async fn read_snippet_file(root: &Path, rel_path: &str) -> Result<String, ToolError> {
12 let path = snippet_path(root, rel_path)?;
13 tokio::fs::read_to_string(&path).await.map_err(|err| {
14 ToolError::internal_message(format!("read snippet `{}`: {err}", path.display()))
15 })
16}