use std::path::PathBuf;
use crate::doctor;
use crate::error::CliError;
use crate::project::{App, run_step};
pub fn build() -> Result<(), CliError> {
let app = App::find_from_current_dir()?;
doctor::require(doctor::BUILD_PREREQUISITES, "frame build")?;
build_application(&app)?;
eprintln!("built {}", host_binary(&app).display());
Ok(())
}
pub fn build_application(app: &App) -> Result<(), CliError> {
build_page_if_stale(app)?;
run_step("cargo", &["build", "-p", "app-host"], &app.root)
}
pub fn build_page_if_stale(app: &App) -> Result<(), CliError> {
let stale = app.stale_page_sources()?;
if stale.is_empty() {
eprintln!("page: compiled modules are current");
return Ok(());
}
if !app.page_toolchain_installed() {
return Err(CliError::PageToolchainMissing {
changed: stale.len(),
});
}
eprintln!("page: {} source(s) changed — compiling (tsc)…", stale.len());
run_step("npm", &["run", "build"], &app.page_dir())
}
#[must_use]
pub fn host_binary(app: &App) -> PathBuf {
let target_root = std::env::var_os("CARGO_TARGET_DIR").map_or_else(
|| app.root.join("target"),
|directory| app.root.join(directory),
);
target_root.join("debug").join("app-host")
}