use crate::context::CliContext;
use crate::services::DockerService;
use crate::types::ProjectConfig;
use anyhow::Result;
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(())
}
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(())
}