#![allow(dead_code)]
use std::path::{Path, PathBuf};
use rmcp::{transport::TokioChildProcess, ServiceExt};
use tempfile::TempDir;
pub struct TempAlcHome {
pub client: rmcp::service::RunningService<rmcp::RoleClient, ()>,
_tmp: TempDir,
home: PathBuf,
}
impl TempAlcHome {
pub async fn connect() -> Self {
let tmp = TempDir::new().expect("failed to create tempdir");
let home = tmp.path().to_path_buf();
let packages_path = home.join("packages");
std::fs::create_dir_all(&packages_path).expect("failed to create packages dir");
let types_dir = home.join("types");
std::fs::create_dir_all(&types_dir).expect("failed to create types dir");
std::fs::write(types_dir.join("alc.d.lua"), b"").expect("failed to seed alc.d.lua");
let bin = std::env::var("CARGO_BIN_EXE_alc")
.unwrap_or_else(|_| format!("{}/target/debug/alc", env!("CARGO_MANIFEST_DIR")));
let mut cmd = tokio::process::Command::new(bin);
cmd.env("ALC_HOME", &home)
.env("ALC_PACKAGES_PATH", &packages_path);
let transport = TokioChildProcess::new(cmd).expect("failed to spawn alc server");
let client = ().serve(transport).await.expect("failed to initialize MCP session");
Self {
client,
_tmp: tmp,
home,
}
}
pub fn home_path(&self) -> &Path {
&self.home
}
pub fn installed_json(&self) -> PathBuf {
self.home.join("installed.json")
}
pub fn packages_dir(&self) -> PathBuf {
self.home.join("packages")
}
pub async fn cancel(self) {
self.client.cancel().await.expect("cancel failed");
}
}