huber 1.0.11

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

use crate::cmd::CommandTrait;
use crate::lock_huber_ops;
use crate::model::config::Config;
use crate::model::release::{Release, SortModelTrait};
use crate::service::release::{ReleaseService, ReleaseTrait};
use crate::service::{ItemOperationAsyncTrait, ItemOperationTrait};

#[derive(Args)]
pub struct FlushArgs {}

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

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

        let current_releases = release_service.list()?;
        let mut flushed_releases: Vec<Release> = vec![];

        for cr in current_releases.iter() {
            let mut releases = release_service.find(&cr.package).await?;
            if releases.len() == 1 {
                continue;
            }

            releases.sort_by_version();
            for r in releases {
                if !r.current {
                    info!("Removing {}", r);
                    release_service.delete_release(&r)?;
                    info!("{} removed", r);

                    flushed_releases.push(r);
                }
            }
        }

        if flushed_releases.is_empty() {
            info!("Nothing to flush");
        }

        Ok(())
    }
}