Skip to main content

upstream_rs/application/features/
remove.rs

1use anyhow::Result;
2use console::style;
3use indicatif::{ProgressBar, ProgressDrawTarget, ProgressStyle};
4use std::time::Duration;
5
6use crate::{
7    application::operations::remove_operation::RemoveOperation,
8    services::storage::package_storage::PackageStorage, utils::static_paths::UpstreamPaths,
9};
10
11pub fn run(names: Vec<String>, purge: bool) -> Result<()> {
12    let paths = UpstreamPaths::new();
13
14    let mut package_storage = PackageStorage::new(&paths.config.packages_file)?;
15
16    let mut package_remover = RemoveOperation::new(&mut package_storage, &paths);
17
18    let overall_pb = ProgressBar::new(0);
19    overall_pb.set_draw_target(ProgressDrawTarget::stderr_with_hz(10));
20    overall_pb.set_style(ProgressStyle::with_template(
21        "{spinner:.green} Removed {pos}/{len} packages",
22    )?);
23    overall_pb.enable_steady_tick(Duration::from_millis(120));
24
25    let overall_pb_ref = overall_pb.clone();
26    let mut overall_progress_callback = Some(move |done: u32, total: u32| {
27        overall_pb_ref.set_length(total as u64);
28        overall_pb_ref.set_position(done as u64);
29    });
30
31    let overall_pb_for_messages = overall_pb.clone();
32    let mut message_callback = Some(move |msg: &str| {
33        overall_pb_for_messages.println(msg);
34    });
35
36    if names.len() > 1 {
37        let (removed, failed) = package_remover.remove_bulk(
38            &names,
39            &purge,
40            &mut message_callback,
41            &mut overall_progress_callback,
42        )?;
43        overall_pb.finish_and_clear();
44        if failed > 0 {
45            println!(
46                "{}",
47                style(format!(
48                    "Removal complete: {} removed, {} failed.",
49                    removed, failed
50                ))
51                .yellow()
52            );
53        } else {
54            println!(
55                "{}",
56                style(format!("Removal complete: {} removed, 0 failed.", removed)).green()
57            );
58        }
59    } else {
60        package_remover.remove_single(&names[0], &purge, &mut message_callback)?;
61        overall_pb.finish_and_clear();
62        println!(
63            "{}",
64            style("Removal complete: 1 removed, 0 failed.").green()
65        );
66    }
67
68    Ok(())
69}