mecha10-cli 0.8.0

Mecha10 CLI tool
Documentation
//! Docker services + Redis connection setup for dev mode

use crate::context::CliContext;
use crate::services::DockerService;
use crate::types::ProjectConfig;
use anyhow::Result;

/// Start Docker services if configured
pub async fn start_docker_services(ctx: &mut CliContext, config: &ProjectConfig, project_name: &str) -> Result<()> {
    println!("๐Ÿณ Starting project services...");

    let proj = ctx.project()?;
    let compose_path = proj.root().join(&config.docker.compose_file);

    if compose_path.exists() {
        let docker = DockerService::with_compose_file(compose_path.to_string_lossy().to_string());

        let mut services = config.docker.robot.clone();
        if mecha10_core::ollama::project_needs_ollama(proj.root()).unwrap_or(false)
            && !services.iter().any(|s| s == "ollama")
        {
            services.push("ollama".to_string());
        }

        match docker.start_project_services(&services, project_name).await {
            Ok(true) => {
                println!("โœ… Services started");
                println!();
            }
            Ok(false) => {
                println!("  Services already running");
                println!();
            }
            Err(e) => {
                println!("โš ๏ธ  Warning: Failed to start services: {}", e);
                println!("   You can manually start them with: docker compose -f docker/docker-compose.yml up -d");
                println!();
            }
        }
    }

    Ok(())
}

/// Setup Redis connection and flush for clean dev session
pub async fn setup_redis_connection(ctx: &mut CliContext) -> Result<()> {
    println!("Checking Redis connection...");
    let redis_url = ctx.redis_url().to_string();
    let redis = ctx.redis()?;

    match redis.get_connection().await {
        Ok(mut conn) => {
            println!("โœ… Redis connected: {}", redis_url);

            println!("๐Ÿงน Flushing Redis for clean dev session...");
            let dev_service = ctx.dev();
            dev_service.flush_redis(&mut conn).await?;
            println!("โœ… Redis flushed");
        }
        Err(e) => {
            println!("โŒ Redis connection failed: {}", e);
            println!();
            println!("Please ensure Redis is running:");
            println!("  docker compose -f docker/docker-compose.yml up -d redis");
            println!();
            return Err(anyhow::anyhow!("Redis connection required for dev mode"));
        }
    }
    println!();

    Ok(())
}