use std::{
fs,
path::PathBuf,
time::{SystemTime, UNIX_EPOCH},
};
use crate::{
build::find_target::{BuildProfile, resolve_target_root},
commons::{ErrorCode, command::CommandRun},
};
use super::Workspace;
const TARGET: &str = "wasm32-unknown-unknown";
fn build_id() -> String {
SystemTime::now()
.duration_since(UNIX_EPOCH)
.map(|since_epoch| since_epoch.as_nanos().to_string())
.unwrap_or_default()
}
pub fn run_cargo_build(
package_name: &str,
vertigo_public_path: &str,
ws: &Workspace,
allow_error: bool,
release: bool,
cargo_opts: &[String],
) -> Result<Result<PathBuf, String>, ErrorCode> {
log::info!("Building {package_name}");
let profile = BuildProfile::resolve(release, cargo_opts);
let target_dir = resolve_target_root(ws.get_target_dir(), cargo_opts)
.join(TARGET)
.join(&profile.dir);
let _ = fs::remove_dir_all(target_dir.join("tailwind"));
let _ = fs::remove_dir_all(target_dir.join("static").join("included"));
let mut command = CommandRun::new("cargo").add_param("build");
if release {
command = command.add_param("--locked");
if !profile.from_cargo_opts {
command = command.add_param("--release");
}
}
command = command
.add_param("--target")
.add_param(TARGET)
.add_param("--package")
.add_param(package_name)
.env("VERTIGO_PUBLIC_PATH", vertigo_public_path)
.env("VERTIGO_BUNDLE", "true")
.env("VERTIGO_TARGET_DIR", target_dir.to_string_lossy())
.env("VERTIGO_BUILD_ID", build_id());
for opt in cargo_opts {
command = command.add_param(opt);
}
if allow_error {
command = command.allow_error();
} else {
command = command.set_error_code(ErrorCode::BuildFailed);
}
let (status, output) = command.output_with_status()?;
if status.success() {
Ok(Ok(target_dir))
} else {
Ok(Err(output))
}
}