use anyhow::{anyhow, Result};
use console::style;
use crate::registry::Registry;
use crate::runner;
use crate::state::State;
use crate::template::Template;
pub fn run(name: Option<String>) -> Result<()> {
let mut state = State::load()?;
let reg = Registry::load()?;
let target_name = match name.or_else(|| state.active_project.clone()) {
Some(n) => n,
None => {
println!("{}", style("Nothing to stop. No active project.").yellow());
return Ok(());
}
};
let project = reg
.find(&target_name)
.ok_or_else(|| anyhow!("Project not found: {}", target_name))?;
if !project.path.exists() {
println!(
" {} project dir missing: {}",
style("[WARN]").yellow(),
project.path.display()
);
if state.active_project.as_deref() == Some(&target_name) {
state.set_active(None);
state.save()?;
}
return Ok(());
}
let templates = Template::list_all()?;
let tpl = templates
.into_iter()
.find(|t| t.manifest.meta.name == project.template);
println!("{}", style("devist stop").bold());
println!();
if let Some(t) = tpl {
if let Some(cmd) = &t.manifest.commands.backend_stop {
println!(
" {} {} ({})",
style("[DOWN]").yellow(),
style(&target_name).bold(),
style(cmd).dim()
);
runner::run_in(&project.path, cmd)?;
} else {
println!(
" {} no backend_stop command for template {}",
style("[SKIP]").dim(),
project.template
);
}
} else {
println!(
" {} template {} not installed",
style("[WARN]").yellow(),
project.template
);
}
if state.active_project.as_deref() == Some(&target_name) {
state.set_active(None);
state.save()?;
}
println!();
println!("{}", style("Stopped.").green());
Ok(())
}