cpkg/subcommand/
remove.rs

1use crate::cli::ARGUMENT_ASSUME_YES;
2use crate::cli::ARGUMENT_DRY_RUN;
3use crate::cli::ARGUMENT_PACKAGES;
4use crate::database;
5use crate::prelude::*;
6use crate::provider;
7
8#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
9pub struct Options {
10    pub assume_yes: bool,
11    pub dry_run: bool,
12}
13
14#[allow(clippy::use_debug)]
15pub fn run(matches: &clap::ArgMatches) -> Result<()> {
16    // Get all packages the user wants to remove from the command line
17    let packages: Vec<&String> = matches
18        .get_many::<String>(ARGUMENT_PACKAGES)
19        .ok_or_else(|| Error::ClapArguments("PACKAGES argument should have been set"))?
20        .collect();
21
22    // Get options
23    let options = Options {
24        assume_yes: matches.get_flag(ARGUMENT_ASSUME_YES),
25        dry_run: matches.get_flag(ARGUMENT_DRY_RUN),
26    };
27
28    // Load database
29    // TODO: Don't hardcode database path
30    let database = database::load_from_file("database.toml")?;
31
32    let providers = provider::get_all_providers();
33
34    // TODO: Use a hiarchey to remove and not all of them
35    for provider in providers {
36        if !provider.is_installed() {
37            continue;
38        }
39
40        // Translate packages
41        let mut translated_packages = Vec::with_capacity(packages.len());
42
43        for package_name in &packages {
44            if let Some(application) = database.packages.get(package_name as &str) {
45                translated_packages.push(provider.lookup_package(application, package_name));
46            } else {
47                // TODO: Don't return generic error
48                return Err(Error::Generic(format!(
49                    "Package '{package_name}' not found in database"
50                )));
51            }
52        }
53
54        println!("Removing {:?} with {}", packages, provider.name());
55        provider.remove_packages(&translated_packages, &options)?;
56    }
57
58    Ok(())
59}