use std::path::Path;
use std::process::Command;
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("cargo:rerun-if-changed=proto/peerman.proto");
println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rerun-if-changed=frontend/src");
println!("cargo:rerun-if-changed=frontend/package.json");
println!("cargo:rerun-if-changed=frontend/vite.config.ts");
tonic_build::configure()
.build_server(true)
.build_client(true)
.compile_protos(&["proto/peerman.proto"], &["proto"])?;
let frontend_dir = Path::new("frontend");
let dist_dir = frontend_dir.join("dist");
if std::env::var("SKIP_FRONTEND_BUILD").is_ok() {
println!("cargo:warning=SKIP_FRONTEND_BUILD set, skipping frontend build");
return Ok(());
}
if dist_dir.exists() {
println!("cargo:warning=frontend/dist/ already exists, skipping frontend build");
return Ok(());
}
if !frontend_dir.join("package.json").exists() {
println!("cargo:warning=No frontend/package.json found, skipping frontend build");
return Ok(());
}
println!("cargo:warning=frontend/dist/ missing, building frontend...");
let install = Command::new("pnpm")
.args(["install", "--frozen-lockfile"])
.current_dir(frontend_dir)
.status();
if install.is_err() {
panic!(
"pnpm not available and frontend/dist/ does not exist. Install pnpm or run: cd frontend && pnpm install && pnpm run build"
);
}
let status = Command::new("pnpm")
.args(["run", "build"])
.current_dir(frontend_dir)
.status();
match status {
Ok(s) if s.success() => println!("cargo:warning=Frontend build succeeded"),
Ok(s) => panic!("Frontend build failed with exit code: {:?}", s.code()),
Err(_) => panic!("pnpm build command failed"),
}
Ok(())
}