dmclc5 0.3.2

A minecraft launching library
Documentation
use crate::{components::mods::{new_forgelike::NewerForgeLikeModLoader, ModInfo, ModLoader}, minecraft::schemas::{Argument, VersionJSON}, LauncherContext};

use super::forgelike::ForgeLikeInstaller;

pub(crate) struct NeoForgeInstaller;

impl ForgeLikeInstaller for NeoForgeInstaller {
    #[cfg(feature = "mod_loaders")]
    fn get_mod_loaders(&self, version: &str, _: &LauncherContext) -> Vec<Box<dyn ModLoader>> {
        let id = if version.starts_with("1.20.1-") {
            "forge".to_string()
        } else {
            "neoforge".to_string()
        };
        let mods_toml_name = if version.starts_with("1.20.1-") || (version.starts_with("20.") && ['2', '3', '4'].contains(&version.chars().collect::<Vec<char>>()[3])) {
            "mods.toml".to_string()
        } else {
            "neoforge.mods.toml".to_string()
        };
        let loader = NewerForgeLikeModLoader {
            builtin_mod: ModInfo {
                name: Some("NeoForge".to_string()),
                id,
                version: Some(versions::Versioning::new(version).unwrap()),
                desc: Some("NeoForge, a NEW broad compatibility API.".to_string()),
                license: "LGPL-2.1".to_string(),
                depends: vec![],
                recommends: vec![],
                suggests: vec![],
                conflicts: vec![],
                breaks: vec![],
            },
            mods_toml_name
        };
        vec![Box::new(loader)]
    }

    fn supports_older_version(&self) -> bool {
        false
    }

    fn find_in_version(&self, mc: &VersionJSON) -> Option<String> {
        if let VersionJSON::New { arguments, base: _ } = mc {
            for arg2 in arguments.game.as_ref()?.windows(2) {
                if let Argument::String(v) = &arg2[0] && v == "--fml.neoForgeVersion" && let Argument::String(w) = &arg2[1] {
                    return Some(w.to_string());
                }
            }
        }
        None
    }

    fn get_maven_group_url(&self) -> String {
        return "https://maven.neoforged.net/releases/net/neoforged".to_string();
    }

    fn get_archive_base_name(&self, mc_version: &str) -> String {
        if mc_version == "1.20.1" {
            "forge".to_string()
        } else {
            "neoforge".to_string()
        }
    }

    fn match_version(&self, loader: &str, mc: &str) -> bool {
        if mc == "1.20.1" {
            loader.starts_with("1.20.1-")
        } else if mc.contains("-") || mc.contains("w") {
            false
        } else {
            loader.starts_with(&mc.chars().skip(2).collect::<String>())
        }
    }
}