upstream-rs 1.16.3

Fetch package updates directly from the source.
Documentation
use crate::{
    application::operations::import_operation::{ImportKind, ImportOperation},
    services::storage::package_storage::PackageStorage,
    utils::static_paths::UpstreamPaths,
};
use anyhow::Result;
use console::style;
use indicatif::{ProgressBar, ProgressDrawTarget, ProgressStyle};
use std::path::PathBuf;
use std::time::Duration;

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ImportKindArg {
    Keys,
    Manifest,
    Snapshot,
}

impl From<ImportKindArg> for ImportKind {
    fn from(value: ImportKindArg) -> Self {
        match value {
            ImportKindArg::Keys => ImportKind::Keys,
            ImportKindArg::Manifest => ImportKind::Manifest,
            ImportKindArg::Snapshot => ImportKind::Snapshot,
        }
    }
}

pub async fn run_import(
    path: PathBuf,
    skip_failed: bool,
    import_as: Option<ImportKindArg>,
) -> Result<()> {
    let paths = UpstreamPaths::new()?;
    let mut package_storage = PackageStorage::new(&paths.config.packages_file)?;
    let mut import_op = ImportOperation::new(&mut package_storage, &paths);

    println!(
        "{}",
        style(format!("Importing from '{}' ...", path.display())).cyan()
    );

    let pb = ProgressBar::new(0);
    pb.set_draw_target(ProgressDrawTarget::stderr_with_hz(10));
    pb.set_style(ProgressStyle::with_template(
        "{spinner:.green} [{elapsed_precise}] [{bar:40.cyan/blue}] {bytes}/{total_bytes} ({eta})",
    )?);
    pb.enable_steady_tick(Duration::from_millis(120));

    let pb_ref = &pb;
    let mut download_progress_callback = Some(move |downloaded: u64, total: u64| {
        pb_ref.set_length(total);
        pb_ref.set_position(downloaded);
    });

    let mut overall_progress_callback: Option<Box<dyn FnMut(u32, u32)>> = None;

    let mut message_callback = Some(move |msg: &str| {
        pb_ref.println(msg);
    });

    import_op
        .import(
            &path,
            skip_failed,
            import_as.map(Into::into),
            &mut download_progress_callback,
            &mut overall_progress_callback,
            &mut message_callback,
        )
        .await?;

    pb.set_position(pb.length().unwrap_or(0));
    pb.finish_with_message("Import complete");
    println!("{}", style("Import complete.").green());

    Ok(())
}