use std::path::{Path, PathBuf};
use lighty_core::AppState;
use lighty_loaders::types::{Loader, VersionInfo};
use lighty_modsloader::{ModRequest, WithMods};
#[cfg(any(feature = "modrinth", feature = "curseforge"))]
use lighty_modsloader::ModpackSource;
#[derive(Debug, Clone)]
pub struct LightyVersionBuilder {
pub name: String,
pub server_url: String,
pub minecraft_version: Option<String>,
pub loader: Option<Loader>,
pub game_dirs: PathBuf,
pub java_dirs: PathBuf,
pub mod_requests: Vec<ModRequest>,
}
impl LightyVersionBuilder {
pub fn new(name: &str, server_url: &str) -> Self {
Self {
name: name.to_string(),
server_url: server_url.to_string(),
minecraft_version: None,
loader: None,
game_dirs: AppState::data_dir().join(name),
java_dirs: AppState::config_dir().join("jre"),
mod_requests: Vec::new(),
}
}
pub fn with_mod(self) -> LightyModSourcesBuilder {
LightyModSourcesBuilder {
parent: self,
pending: Vec::new(),
}
}
}
impl VersionInfo for LightyVersionBuilder {
type LoaderType = Loader;
fn name(&self) -> &str {
&self.name
}
fn loader_version(&self) -> &str {
&self.server_url
}
fn minecraft_version(&self) -> &str {
self.minecraft_version.as_ref().map_or("", String::as_str)
}
fn game_dirs(&self) -> &Path {
&self.game_dirs
}
fn java_dirs(&self) -> &Path {
&self.java_dirs
}
fn loader(&self) -> &Self::LoaderType {
self.loader.as_ref().unwrap_or(&Loader::LightyUpdater)
}
}
impl<'b> VersionInfo for &'b LightyVersionBuilder {
type LoaderType = Loader;
fn name(&self) -> &str {
&self.name
}
fn loader_version(&self) -> &str {
&self.server_url
}
fn minecraft_version(&self) -> &str {
self.minecraft_version.as_ref().map_or("", String::as_str)
}
fn game_dirs(&self) -> &Path {
&self.game_dirs
}
fn java_dirs(&self) -> &Path {
&self.java_dirs
}
fn loader(&self) -> &Self::LoaderType {
self.loader.as_ref().unwrap_or(&Loader::LightyUpdater)
}
}
impl WithMods for LightyVersionBuilder {
fn mod_requests(&self) -> &[ModRequest] {
&self.mod_requests
}
#[cfg(any(feature = "modrinth", feature = "curseforge"))]
fn modpack(&self) -> Option<&ModpackSource> {
None
}
}
impl<'b> WithMods for &'b LightyVersionBuilder {
fn mod_requests(&self) -> &[ModRequest] {
&self.mod_requests
}
#[cfg(any(feature = "modrinth", feature = "curseforge"))]
fn modpack(&self) -> Option<&ModpackSource> {
None
}
}
pub struct LightyModSourcesBuilder {
parent: LightyVersionBuilder,
pending: Vec<ModRequest>,
}
impl LightyModSourcesBuilder {
#[cfg(feature = "modrinth")]
pub fn with_modrinth_mods<S>(mut self, list: Vec<(S, Option<String>)>) -> Self
where
S: Into<String>,
{
for (id_or_slug, version) in list {
self.pending.push(ModRequest::Modrinth {
id_or_slug: id_or_slug.into(),
version,
});
}
self
}
#[cfg(feature = "curseforge")]
pub fn with_curseforge_mods(mut self, list: Vec<(u32, Option<u32>)>) -> Self {
for (mod_id, file_id) in list {
self.pending.push(ModRequest::CurseForge { mod_id, file_id });
}
self
}
pub fn done(self) -> LightyVersionBuilder {
let mut parent = self.parent;
let mut pending = self.pending;
parent.mod_requests.append(&mut pending);
parent
}
}