use crate::ui;
use anyhow::{Context, Result};
use clap::Subcommand;
use std::process::{Command, Stdio};
#[derive(Subcommand, Clone, Copy)]
pub enum CleanCommand {
Images,
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(())
}