use anyhow::{Context, Result};
use std::process::Command;
use crate::e_target::{CargoTarget, TargetKind};
pub fn prebuild_examples(targets: &[CargoTarget]) -> Result<()> {
for target in targets {
let (build_flag, use_manifest) = match target.kind {
TargetKind::Example => ("--example", false),
TargetKind::ExtendedExample => ("--example", true),
TargetKind::Binary => ("--bin", false),
TargetKind::ExtendedBinary => ("--bin", true),
TargetKind::ManifestTauriExample => ("", true),
TargetKind::ManifestTauri => ("", true),
TargetKind::Test => ("--test", true),
TargetKind::Manifest => ("", true),
TargetKind::Bench => ("", true),
TargetKind::ManifestDioxus => ("", true),
TargetKind::ManifestDioxusExample => ("", true),
TargetKind::ManifestLeptos => ("", true),
TargetKind::Unknown => ("", true),
_ => ("", true),
};
if build_flag.is_empty() {
return Ok(());
}
println!("Prebuilding target [{}]: {}", build_flag, target.name);
let mut command = Command::new("cargo");
command.arg("build").arg(build_flag).arg(&target.name);
if use_manifest {
command.args(&[
"--manifest-path",
&target.manifest_path.to_str().unwrap_or_default().to_owned(),
]);
}
let status = command
.status()
.with_context(|| format!("Cargo build failed for target {}", target.name))?;
if !status.success() {
return Err(anyhow::anyhow!(
"Prebuild failed for target {}",
target.name
));
}
}
Ok(())
}