use std::path::{Path, PathBuf};
use rmcp::ErrorData as McpError;
pub(crate) fn load_source(
yaml: Option<&str>,
path: Option<&str>,
root: Option<&Path>,
) -> Result<(String, String), McpError> {
match (yaml, path) {
(Some(_), Some(_)) => Err(McpError::invalid_params(
"provide either `yaml` or `path`, not both",
None,
)),
(None, None) => Err(McpError::invalid_params(
"one of `yaml` or `path` is required",
None,
)),
(Some(text), None) => Ok((text.to_string(), "<inline>".to_string())),
(None, Some(p)) => {
let resolved = resolve_path(p, root);
let text = std::fs::read_to_string(&resolved).map_err(|e| {
McpError::invalid_params(format!("cannot read '{}': {e}", resolved.display()), None)
})?;
Ok((text, resolved.display().to_string()))
}
}
}
pub(crate) fn resolve_path(path: &str, root: Option<&Path>) -> PathBuf {
let p = Path::new(path);
match root {
Some(root) if p.is_relative() => root.join(p),
_ => p.to_path_buf(),
}
}