papa 3.0.0-beta.1

A cli mod manager for the Northstar launcher
use crate::{
    config::CONFIG,
    model::ModName,
    readln,
    traits::RemoteIndex,
    utils::{download_and_install, to_file_size_string},
};
use anyhow::Result;
use owo_colors::OwoColorize;
use thermite::{model::ModVersion, prelude::*};
use tracing::debug;

pub fn update(yes: bool) -> Result<()> {
    println!("Checking for outdated packages...");
    let index = get_package_index()?;
    let local = find_mods(CONFIG.install_dir())?;
    let mut outdated: Vec<(ModName, &ModVersion)> = vec![];
    for l in local {
        let Ok(l) = &l else { continue };
        debug!("Checking if mod '{}' is out of date", l.manifest.name);

        if let Some(m) = index.get_mod(&l.into()) {
            debug!("Checking mod {:?}", m);
            if m.latest != l.manifest.version_number {
                outdated.push((m.into(), m.get_latest().expect("Missing latest version")));
            }
        }
    }

    if outdated.len() == 0 {
        println!("All packages up to date!");
        return Ok(());
    }

    let filesize = to_file_size_string(outdated.iter().map(|(_, v)| v.file_size).sum());

    println!("Found {} outdated packages:\n", outdated.len().bold());
    for (name, _) in outdated.iter() {
        println!("  {}", name.bright_cyan());
    }
    println!("\nTotal download size: {}", filesize.bold());

    let answer = if !yes {
        readln!("OK? [Y/n]: ")?
    } else {
        String::new()
    };

    if !answer.to_lowercase().starts_with("n") {
        download_and_install(outdated)?;
        Ok(())
    } else {
        Ok(())
    }
}