Skip to main content

conduit_cli/core/
loader_installer.rs

1use crate::core::error::{CoreError, CoreResult};
2use crate::core::events::CoreCallbacks;
3use crate::core::io::project::{InstanceType, ProjectFiles};
4use crate::core::paths::CorePaths;
5use crate::loaders::{Loader, LoaderInfo};
6
7pub async fn install_loader(
8    paths: &CorePaths,
9    callbacks: &mut dyn CoreCallbacks,
10) -> CoreResult<()> {
11    let config = ProjectFiles::load_manifest(paths)?;
12
13    if let InstanceType::Client = config.instance_type {
14        return Err(CoreError::ServerOnlyFeature);
15    }
16
17    let loader_info = LoaderInfo::parse(&config.loader);
18
19    let loader = match loader_info.name.as_str() {
20        "neoforge" => Loader::NeoForge,
21        _ => return Err(CoreError::UnsupportedLoader(loader_info.name)),
22    };
23
24    let loader_version = if loader_info.version == "latest" {
25        loader
26            .get_latest_version(&config.mc_version, callbacks)
27            .await?
28    } else {
29        loader_info.version.clone()
30    };
31
32    let loader_dir = loader
33        .download_installer(
34            &config.mc_version,
35            &loader_version,
36            paths.project_dir(),
37            callbacks,
38        )
39        .await?;
40
41    let installer_path = loader.execute_installer(&loader_dir, callbacks).await?;
42
43    loader
44        .post_install(&installer_path, paths.project_dir(), callbacks)
45        .await?;
46
47    let mut lock = ProjectFiles::load_lock(paths)?;
48
49    lock.loader_version = Some(format!("{}@{}", loader_info.name, loader_version));
50
51    ProjectFiles::save_lock(paths, &lock)?;
52
53    Ok(())
54}