use std::path::PathBuf;
use std::process::Command;
use tempfile::TempDir;
pub struct Compiled {
pub binary: PathBuf,
_dir: TempDir,
}
pub fn compile(source: &str) -> Result<Compiled, String> {
let dir = tempfile::tempdir().map_err(|e| e.to_string())?;
let src = dir.path().join("session.pl");
std::fs::write(&src, source).map_err(|e| e.to_string())?;
let binary = dir.path().join("session");
let plgc = std::env::var("PLGC").unwrap_or_else(|_| "plgc".to_string());
let output = Command::new(&plgc)
.arg("build")
.arg(&src)
.arg("-o")
.arg(&binary)
.output()
.map_err(|e| format!("could not run `{plgc}` (is it on PATH? set $PLGC): {e}"))?;
if !output.status.success() {
let msg = String::from_utf8_lossy(&output.stderr);
return Err(msg.trim().to_string());
}
Ok(Compiled { binary, _dir: dir })
}