use std::env;
use std::fs;
use std::path::Path;
use anyhow::{Context, Result};
use fs_extra::dir;
fn main() -> Result<()> {
let manifest_dir = env::var("CARGO_MANIFEST_DIR")?;
let out_dir = env::var("OUT_DIR")?;
println!("cargo:rerun-if-changed=build.rs");
stage_bundle(&manifest_dir, &out_dir, "inspector-ui", "index.html")?;
stage_bundle(&manifest_dir, &out_dir, "inspector-tab", "styles.css")?;
Ok(())
}
fn stage_bundle(manifest_dir: &str, out_dir: &str, name: &str, marker: &str) -> Result<()> {
let manifest = Path::new(manifest_dir);
let in_crate = manifest.join("inspector-dist").join(name);
let monorepo = manifest.join("../../../frontend/dist").join(name);
println!("cargo:rerun-if-changed={}", in_crate.display());
println!("cargo:rerun-if-changed={}", monorepo.display());
let source = if in_crate.join(marker).is_file() {
Some(in_crate)
} else if monorepo.join(marker).is_file() {
Some(monorepo)
} else {
None
};
let staged = Path::new(out_dir).join(name);
if staged.exists() {
fs::remove_dir_all(&staged)?;
}
fs::create_dir_all(&staged)?;
match source {
Some(source) => {
let mut opts = dir::CopyOptions::new();
opts.content_only = true;
opts.overwrite = true;
dir::copy(&source, &staged, &opts)
.with_context(|| format!("failed to copy {} into OUT_DIR", source.display()))?;
}
None => {
fs::write(staged.join(".empty"), b"")?;
}
}
Ok(())
}