pub mod forgelike;
pub(crate) mod neoforge;
pub(crate) mod forge;
pub mod fabriclike;
use anyhow::{anyhow, Result};
use async_trait::async_trait;
use tokio::sync::mpsc;
use crate::{minecraft::{schemas::VersionJSON, version::{ComponentInfo, MinecraftInstallation}}, utils::DownloadAllMessage, LauncherContext};
use super::mods::ModLoader;
#[async_trait]
pub trait ComponentInstaller: Send + Sync {
async fn get_suitable_loader_versions(&self, mc: &MinecraftInstallation) -> Result<Vec<String>>;
async fn install(&self, mc: &mut MinecraftInstallation, version: &str, download_channel: mpsc::UnboundedSender<DownloadAllMessage>) -> Result<()>;
fn find_in_version(&self, v: &VersionJSON) -> Option<String>;
#[cfg(feature = "mod_loaders")]
async fn get_mod_loaders(&self, version: &str, launcher: &LauncherContext) -> Result<Vec<Box<dyn ModLoader>>>;
}
impl MinecraftInstallation<'_> {
pub async fn install_component(&mut self, component: &str, version: &str, download_channel: mpsc::UnboundedSender<DownloadAllMessage>) -> Result<()> {
if let None = self.extra_data.version {
return Err(anyhow!(t!("loaders.minecraft_version_unknown")));
}
self.launcher.component_installers[component].install(self, version, download_channel).await?;
self.extra_data.components.push(ComponentInfo {
name: component.to_string(),
version: version.to_string()
});
Ok(())
}
}