use std::env;
use std::fs;
use std::path::Path;
use std::process::Command;
fn main() {
if env::var("SERVICE_KIT_BUILDING_WASM").ok().as_deref() == Some("1") {
println!("cargo:warning=Detected recursive wasm build, skipping in build.rs");
return;
}
if env::var("SERVICE_KIT_BUILD_WASM").ok().as_deref() != Some("1") {
println!("cargo:warning=Skipping WASM build (set SERVICE_KIT_BUILD_WASM=1 to enable)");
return;
}
if let Ok(target) = env::var("TARGET") {
if target.contains("wasm32") {
println!("cargo:warning=TARGET is wasm32; skipping WASM build to avoid recursion");
return;
}
}
println!("cargo:rerun-if-changed=forge-cli-wasm/src");
println!("cargo:rerun-if-changed=forge-cli-wasm/Cargo.toml");
if !is_wasm_pack_available() {
println!("cargo:warning=wasm-pack not found, skipping WASM build. Install with: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh");
return;
}
let wasm_project_dir = Path::new("forge-cli-wasm");
let output_dir = Path::new("frontend-wasm-cli");
if let Err(e) = fs::create_dir_all(output_dir) {
println!("cargo:warning=Failed to create output directory: {}", e);
return;
}
println!("cargo:warning=Building WASM project...");
let status = Command::new("wasm-pack")
.arg("build")
.arg("--target")
.arg("web")
.arg("--out-dir")
.arg("../frontend-wasm-cli")
.current_dir(wasm_project_dir)
.env("SERVICE_KIT_BUILDING_WASM", "1")
.status();
match status {
Ok(status) => {
if status.success() {
println!("cargo:warning=WASM build completed successfully");
sync_wasm_to_template();
} else {
println!("cargo:warning=WASM build failed with exit code: {:?}", status.code());
}
}
Err(e) => {
println!("cargo:warning=Failed to execute wasm-pack: {}", e);
}
}
}
fn sync_wasm_to_template() {
let source_dir = Path::new("frontend-wasm-cli");
let target_dir = Path::new("../service-template/assets");
if let Err(e) = fs::create_dir_all(target_dir) {
println!("cargo:warning=Failed to create template assets directory: {}", e);
return;
}
let files_to_sync = [
"forge_cli_wasm.js",
"forge_cli_wasm_bg.wasm",
"index.html",
"main.js",
"style.css",
"package.json",
"README.md",
];
for file in &files_to_sync {
let source_path = source_dir.join(file);
let target_path = target_dir.join(file);
if source_path.exists() {
if let Err(e) = fs::copy(&source_path, &target_path) {
println!("cargo:warning=Failed to copy {}: {}", file, e);
} else {
println!("cargo:warning=Synced {} to template", file);
}
}
}
}
fn is_wasm_pack_available() -> bool {
Command::new("wasm-pack")
.arg("--version")
.output()
.is_ok()
}