conduit_cli/core/
loader_installer.rs1use 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}