oph 0.1.0

OpenHealth CLI - Universal development tool for the OpenHealth team
Documentation
use crate::ui;
use anyhow::{Context, Result};
use clap::Subcommand;
use std::process::{Command, Stdio};

#[derive(Subcommand, Clone, Copy)]
pub enum CleanCommand {
    /// Remove unused Docker images
    Images,
    /// Remove all unused Docker resources (containers, networks, images, volumes)
    All,
}

pub fn run(cmd: CleanCommand) -> Result<()> {
    match cmd {
        CleanCommand::Images => clean_images()?,
        CleanCommand::All => clean_all()?,
    }

    Ok(())
}

fn clean_images() -> Result<()> {
    ui::info("Removing unused Docker images...");

    let status = Command::new("docker")
        .args(["image", "prune", "-f"])
        .stdin(Stdio::inherit())
        .stdout(Stdio::inherit())
        .stderr(Stdio::inherit())
        .status()
        .context("Failed to execute docker")?;

    if status.success() {
        ui::success("Done!");
    }

    Ok(())
}

fn clean_all() -> Result<()> {
    if !ui::confirm_dangerous(
        "This will remove all unused containers, networks, images, and volumes!",
    ) {
        ui::info("Aborted.");
        return Ok(());
    }

    ui::info("Removing all unused Docker resources...");

    let status = Command::new("docker")
        .args(["system", "prune", "-af", "--volumes"])
        .stdin(Stdio::inherit())
        .stdout(Stdio::inherit())
        .stderr(Stdio::inherit())
        .status()
        .context("Failed to execute docker")?;

    if status.success() {
        ui::success("Cleanup complete!");
    }

    Ok(())
}