use crate::services::docker::types::DockerInfo;
use anyhow::{Context, Result};
use std::process::Command;
pub fn check_installation() -> Result<DockerInfo> {
let output = Command::new("docker")
.arg("--version")
.output()
.context("Failed to execute 'docker --version'. Is Docker installed?")?;
if !output.status.success() {
return Err(anyhow::anyhow!(
"Docker is not installed or not accessible. Please install Docker: https://docs.docker.com/get-docker/"
));
}
let version = String::from_utf8_lossy(&output.stdout).trim().to_string();
let compose_version = check_compose_version()?;
Ok(DockerInfo {
version,
compose_version,
})
}
pub fn check_compose_version() -> Result<String> {
if let Ok(output) = Command::new("docker").args(["compose", "version"]).output() {
if output.status.success() {
return Ok(String::from_utf8_lossy(&output.stdout).trim().to_string());
}
}
if let Ok(output) = Command::new("docker-compose").arg("--version").output() {
if output.status.success() {
return Ok(String::from_utf8_lossy(&output.stdout).trim().to_string());
}
}
Err(anyhow::anyhow!(
"Docker Compose is not installed. Please install Docker Compose: https://docs.docker.com/compose/install/"
))
}
pub fn check_daemon() -> Result<()> {
let output = Command::new("docker")
.arg("info")
.output()
.context("Failed to execute 'docker info'")?;
if !output.status.success() {
let stderr = String::from_utf8_lossy(&output.stderr);
if stderr.contains("Cannot connect to the Docker daemon") {
return Err(anyhow::anyhow!(
"Docker daemon is not running. Please start Docker and try again."
));
} else {
return Err(anyhow::anyhow!("Docker daemon check failed: {}", stderr));
}
}
Ok(())
}