use anyhow::{Context, Result};
use std::path::PathBuf;
use std::process::Command;
pub fn run(manifest_path: &Option<PathBuf>, verbose: bool) -> Result<()> {
let mut cmd = Command::new("cargo");
cmd.arg("check");
cmd.arg("--message-format=json");
if let Some(ref path) = manifest_path {
cmd.arg("--manifest-path").arg(path);
}
if verbose {
cmd.arg("--verbose");
}
let output = cmd
.output()
.context("failed to run `cargo check` — is Cargo installed?")?;
if !output.status.success() {
let stderr = String::from_utf8_lossy(&output.stderr);
let mut has_tupa_error = false;
for line in stderr.lines() {
if line.contains("tupa_core")
|| line.contains("tupa_engine")
|| line.contains("pipeline")
{
eprintln!("{}", line);
has_tupa_error = true;
}
}
if !has_tupa_error {
eprintln!("{}", stderr);
}
std::process::exit(output.status.code().unwrap_or(1));
}
if verbose {
println!("✅ Pipeline typecheck passed");
}
Ok(())
}