use std::path::Path;
use alba_core::{ExecutorKind, Project, render_template};
use crate::exit::EXIT_ALBA_ERROR;
use crate::render::LineSink;
pub fn run(project: &Project, beamfile: &Path) -> i32 {
let mut err = LineSink::stderr();
let mut failed = false;
for beam in &project.beams {
if beam.executor != ExecutorKind::Shell || !beam.params.is_empty() {
continue;
}
for template in &beam.run {
let Ok(command) = render_template(template, &beam.scope) else {
continue;
};
if let Err(error) = alba_shell::parse(&command) {
failed = true;
err.line(&format!(
"beam `{}`: invalid embedded shell command",
beam.id.0
));
for line in error.render(&command).lines() {
err.line(line);
}
}
}
}
if failed {
return EXIT_ALBA_ERROR;
}
if !project.hooks.is_empty() {
let root = alba_engine::beamfile_dir(beamfile);
let installed = super::hooks::expected_hooks_path(beamfile)
.ok()
.zip(alba_core::git::hooks_path(&root).ok().flatten())
.is_some_and(|(expected, current)| expected == current);
if !installed {
let count = project.hooks.len();
let noun = if count == 1 { "hook" } else { "hooks" };
err.line(&format!(
"\u{26a0} {count} {noun} declared, run 'alba hooks install'"
));
}
}
let beam_count = project.beams.len();
let beam_noun = if beam_count == 1 { "beam" } else { "beams" };
let summary = if project.hooks.is_empty() {
format!("\u{2713} Beamfile: {beam_count} {beam_noun}")
} else {
let hook_count = project.hooks.len();
let hook_noun = if hook_count == 1 { "hook" } else { "hooks" };
format!("\u{2713} Beamfile: {beam_count} {beam_noun}, {hook_count} {hook_noun}")
};
LineSink::stdout().line(&summary);
0
}