ggen_cli_lib/cmds/
remove.rs

1use anyhow::Result;
2use clap::Args;
3use ggen_core::{CacheManager, LockfileManager};
4use std::env;
5
6#[derive(Args, Debug)]
7pub struct RemoveArgs {
8    /// Rpack ID to remove
9    pub rpack_id: String,
10
11    /// Also remove from cache (frees disk space)
12    #[arg(long)]
13    pub prune: bool,
14}
15
16pub fn run(args: &RemoveArgs) -> Result<()> {
17    // Get current working directory
18    let current_dir = env::current_dir()?;
19    let lockfile_manager = LockfileManager::new(&current_dir);
20    let cache_manager = CacheManager::new()?;
21
22    // Check if pack is installed
23    if !lockfile_manager.is_installed(&args.rpack_id)? {
24        println!("Rpack '{}' is not installed", args.rpack_id);
25        return Ok(());
26    }
27
28    // Get pack info before removal
29    let pack_entry = lockfile_manager
30        .get(&args.rpack_id)?
31        .expect("Pack should exist since is_installed returned true");
32
33    // Remove from lockfile
34    let removed = lockfile_manager.remove(&args.rpack_id)?;
35    if !removed {
36        println!("Failed to remove rpack '{}' from lockfile", args.rpack_id);
37        return Ok(());
38    }
39
40    // Remove from cache if requested
41    if args.prune {
42        if let Err(e) = cache_manager.remove(&args.rpack_id, &pack_entry.version) {
43            println!("Warning: Failed to remove rpack from cache: {}", e);
44        } else {
45            println!("Removed rpack from cache");
46        }
47    }
48
49    println!(
50        "✅ Successfully removed rpack '{}' version {}",
51        args.rpack_id, pack_entry.version
52    );
53
54    Ok(())
55}