cargo-sideload 0.8.1

Tools for working with private Cargo registries
use cargo::{
    core::{Summary, Verbosity},
    util::config::Config as CargoConfig,
};

use crate::{args::CargoSideloadListArgs, utils};

pub fn list(args: CargoSideloadListArgs) -> anyhow::Result<()> {
    let cargo_config = CargoConfig::default()?;
    if args.quiet {
        cargo_config.shell().set_verbosity(Verbosity::Quiet);
    }

    let mut registry = utils::create_registry(&cargo_config, &args.registry)?;

    utils::update_index(&cargo_config, &mut registry)?;
    let summaries = utils::package_summaries(&cargo_config, &mut registry, &args.name)?;

    if args.latest {
        print_latest(&summaries, args.version_only);
    } else {
        print_published(&summaries, args.version_only);
    }

    Ok(())
}

fn print_published(summaries: &[Summary], version_only: bool) {
    for summary in summaries {
        if version_only {
            println!("{}", summary.version())
        } else {
            print_summary(summary);
        }
    }
}

fn print_latest(summaries: &[Summary], version_only: bool) {
    let latest_version = utils::latest_version(summaries);

    match (latest_version, version_only) {
        (Some(latest), true) => println!("{}", latest.version()),
        (Some(latest), false) => print_summary(latest),
        _ => println!("Package not found"),
    }
}

fn print_summary(summary: &Summary) {
    println!(
        r#"{{
    "name": "{}",
    "version": "{}",
    "checksum": "{:?}",
}}"#,
        summary.name(),
        summary.version(),
        summary.checksum()
    )
}