papa 3.0.0-rc.2

A cli mod manager for the Northstar launcher
use anyhow::Result;
use owo_colors::OwoColorize;
use tracing::debug;

use crate::{config::CONFIG, model::ModName};
use thermite::{
    model::{EnabledMods, InstalledMod},
    prelude::{find_mods, get_enabled_mods, ThermiteError},
    CORE_MODS,
};

pub fn enable(mut mods: Vec<String>) -> Result<()> {
    let dir = CONFIG.install_dir();
    debug!("Getting installed mods from {}", dir.display());
    let installed = find_mods(dir)?
        .into_iter()
        .filter_map(|v| v.ok())
        .filter(|v| {
            debug!("Checking if {} should be enabled", ModName::from(v));
            let res = mods.iter().enumerate().find_map(|(i, m)| {
                if let Ok(mn) = TryInto::<ModName>::try_into(m.as_str()) {
                    if (mn.author.to_lowercase() == v.author.to_lowercase()
                        && mn.name.to_lowercase() == v.manifest.name.to_lowercase())
                        || m.to_lowercase() == v.mod_json.name.to_lowercase()
                    {
                        Some(i)
                    } else {
                        None
                    }
                } else if m.to_lowercase() == v.mod_json.name.to_lowercase() {
                    Some(i)
                } else {
                    None
                }
            });

            if let Some(i) = res {
                debug!("Yes");
                mods.swap_remove(i);
                true
            } else {
                debug!("No");
                false
            }
        })
        .collect::<Vec<InstalledMod>>();

    let mut enabled_mods = match get_enabled_mods(dir.join("..")) {
        Ok(mods) => mods,
        Err(ThermiteError::MissingFile(path)) => EnabledMods::default_with_path(*path),
        Err(e) => return Err(e.into()),
    };

    debug!("Enabled mods: {:?}", enabled_mods.mods);

    for i in installed {
        if CORE_MODS.contains(&i.mod_json.name.as_str()) {
            match i.mod_json.name.as_str() {
                "Northstar.Client" => enabled_mods.client = true,
                "Northstar.Custom" => enabled_mods.custom = true,
                "Northstar.CustomServers" => enabled_mods.servers = true,
                _ => unimplemented!(),
            }

            println!("Enabled {}", format!("{}", i.mod_json.name).bright_green());

            continue;
        }
        enabled_mods.mods.insert(i.mod_json.name, false);
        println!(
            "Enabled {}",
            format!("{}.{}", i.author, i.manifest.name).bright_green()
        );
    }

    if !mods.is_empty() {
        for m in mods {
            println!("Couldn't find {}", m.bright_cyan());
        }
    }

    Ok(())
}