use std::path::{Path, PathBuf};
use serde_json::json;
use crate::error::DriverError;
pub fn write_mcp_config(
workspace: &Path,
bin_path: &Path,
socket_path: &Path,
) -> Result<PathBuf, DriverError> {
let bin_abs = absolute_path(bin_path);
let sock_abs = absolute_path(socket_path);
let cfg = json!({
"mcpServers": {
"nexo-driver-permission": {
"command": bin_abs.to_string_lossy(),
"args": ["--socket", sock_abs.to_string_lossy()],
"env": {}
}
}
});
let path = workspace.join(".nexo-mcp.json");
let pretty = serde_json::to_vec_pretty(&cfg)?;
std::fs::write(&path, pretty)?;
Ok(path)
}
fn absolute_path(p: &Path) -> PathBuf {
if p.is_absolute() {
return p.to_path_buf();
}
if let Ok(canon) = std::fs::canonicalize(p) {
return canon;
}
if let Ok(cwd) = std::env::current_dir() {
return cwd.join(p);
}
p.to_path_buf()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn produces_valid_json_with_paths() {
let dir = tempfile::tempdir().unwrap();
let bin = std::path::PathBuf::from("/usr/local/bin/nexo-driver-permission-mcp");
let sock = std::path::PathBuf::from("/run/nexo-rs/driver.sock");
let written = write_mcp_config(dir.path(), &bin, &sock).unwrap();
assert!(written.is_file());
let raw = std::fs::read_to_string(&written).unwrap();
let parsed: serde_json::Value = serde_json::from_str(&raw).unwrap();
assert_eq!(
parsed["mcpServers"]["nexo-driver-permission"]["command"],
"/usr/local/bin/nexo-driver-permission-mcp"
);
let args = parsed["mcpServers"]["nexo-driver-permission"]["args"]
.as_array()
.unwrap();
assert_eq!(args[0], "--socket");
assert_eq!(args[1], "/run/nexo-rs/driver.sock");
}
}