use std::process::Command;
use crate::anchor_error::{AnchorError, AnchorResult};
pub fn start_docker_daemon() -> AnchorResult<()> {
if cfg!(target_os = "macos") {
start_docker_macos()
} else if cfg!(target_os = "windows") {
start_docker_windows()
} else {
start_docker_linux()
}
}
fn start_docker_macos() -> AnchorResult<()> {
let docker_paths = ["/Applications/Docker.app", "/System/Applications/Docker.app"];
for path in &docker_paths {
let output = Command::new("open").arg("-a").arg(path).output();
match output {
Ok(output) if output.status.success() => {
return Ok(());
}
Ok(_) | Err(_) => {} }
}
let output = Command::new("sudo")
.args(["launchctl", "start", "com.docker.docker"])
.output();
match output {
Ok(output) if output.status.success() => Ok(()),
_ => Err(AnchorError::ConnectionError(
"Failed to start Docker on macOS. Please start Docker Desktop manually.".to_string(),
)),
}
}
fn start_docker_windows() -> AnchorResult<()> {
let docker_paths = [
r"C:\Program Files\Docker\Docker\Docker Desktop.exe",
r"C:\Program Files (x86)\Docker\Docker\Docker Desktop.exe",
];
for path in &docker_paths {
let output = Command::new("cmd").args(["/C", "start", "", path]).output();
match output {
Ok(output) if output.status.success() => {
return Ok(());
}
Ok(_) | Err(_) => {} }
}
let output = Command::new("powershell")
.args(["-Command", "Start-Process 'Docker Desktop'"])
.output();
match output {
Ok(output) if output.status.success() => Ok(()),
_ => Err(AnchorError::ConnectionError(
"Failed to start Docker on Windows. Please start Docker Desktop manually.".to_string(),
)),
}
}
fn start_docker_linux() -> AnchorResult<()> {
let systemctl_output = Command::new("sudo").args(["systemctl", "start", "docker"]).output();
if let Ok(output) = systemctl_output {
if output.status.success() {
return Ok(());
}
}
let service_output = Command::new("sudo").args(["service", "docker", "start"]).output();
if let Ok(output) = service_output {
if output.status.success() {
return Ok(());
}
}
let dockerd_output = Command::new("sudo").args(["dockerd", "--detach"]).output();
match dockerd_output {
Ok(output) if output.status.success() => Ok(()),
_ => Err(AnchorError::ConnectionError(
"Failed to start Docker on Linux. Please start Docker service manually with 'sudo systemctl start docker' or 'sudo service docker start'.".to_string()
)),
}
}