devist 0.1.1

Project bootstrap CLI for AI-assisted development. Spin up new projects from templates, manage backends, and keep your codebase comprehensible.
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(())
}