huber 1.0.9

Huber, simplify GitHub package management
Documentation
use anyhow::anyhow;
use async_trait::async_trait;
use clap::{Args, ValueHint};
use log::{info, warn};
use simpledi_rs::di::{DIContainer, DIContainerTrait};

use crate::cmd::CommandTrait;
use crate::lock_huber_ops;
use crate::model::config::Config;
use crate::service::package::PackageService;
use crate::service::release::ReleaseService;
use crate::service::{check_pkg_installed, ItemOperationTrait};

#[derive(Args)]
pub struct UninstallArgs {
    #[arg(help = "Package name", num_args = 1, value_hint = ValueHint::Unknown)]
    name: Vec<String>,
}

#[async_trait]
impl CommandTrait for UninstallArgs {
    async fn run(&self, config: &Config, container: &DIContainer) -> anyhow::Result<()> {
        lock_huber_ops!(config);

        let pkg_service = container.get::<PackageService>().unwrap();
        let release_service = container.get::<ReleaseService>().unwrap();

        for name in self.name.iter() {
            if let Err(e) = check_pkg_installed(pkg_service, release_service, name) {
                warn!("Skipped uninstalling package {}: {}", name, e);
                continue;
            }

            info!("Uninstalling {}", name);
            release_service.delete(name)?;
            info!("Uninstalled {}", name);
        }

        Ok(())
    }
}