use rmcp::model::Root;
use std::path::Path;
#[cfg(test)]
use std::path::PathBuf;
pub fn path_to_file_uri(path: &Path) -> String {
#[cfg(unix)]
{
format!("file://{}", path.display())
}
#[cfg(windows)]
{
let path_str = path.display().to_string().replace('\\', "/");
format!("file:///{}", path_str)
}
#[cfg(not(any(unix, windows)))]
{
format!("file://{}", path.display())
}
}
pub fn root_from_path(path: &Path, name: Option<String>) -> Root {
let uri = path_to_file_uri(path);
let root = Root::new(uri);
match name {
Some(n) => root.with_name(n),
None => root,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_path_to_file_uri() {
let path = PathBuf::from("/home/user/project");
let uri = path_to_file_uri(&path);
assert_eq!(uri, "file:///home/user/project");
}
#[test]
fn test_root_from_path() {
let path = PathBuf::from("/home/user/project");
let root = root_from_path(&path, Some("Test Project".to_string()));
assert_eq!(root.uri.as_str(), "file:///home/user/project");
assert_eq!(root.name, Some("Test Project".to_string()));
}
#[test]
fn test_root_from_path_no_name() {
let path = PathBuf::from("/tmp/test");
let root = root_from_path(&path, None);
assert_eq!(root.uri.as_str(), "file:///tmp/test");
assert_eq!(root.name, None);
}
#[test]
fn test_path_with_spaces() {
let path = PathBuf::from("/home/user/my project");
let root = root_from_path(&path, None);
assert_eq!(root.uri.as_str(), "file:///home/user/my project");
}
}