cpkg/subcommand/
remove.rs1use 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 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 let options = Options {
24 assume_yes: matches.get_flag(ARGUMENT_ASSUME_YES),
25 dry_run: matches.get_flag(ARGUMENT_DRY_RUN),
26 };
27
28 let database = database::load_from_file("database.toml")?;
31
32 let providers = provider::get_all_providers();
33
34 for provider in providers {
36 if !provider.is_installed() {
37 continue;
38 }
39
40 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 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}