conduit_cli/core/server/
install.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::core::runtime::loaders::{LoaderInfo, LoaderType};
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" => LoaderType::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.post_install(&installer_path, paths.project_dir(), callbacks)?;
44
45 let mut lock = ProjectFiles::load_lock(paths)?;
46
47 lock.loader_version = Some(format!("{}@{}", loader_info.name, loader_version));
48
49 ProjectFiles::save_lock(paths, &lock)?;
50
51 Ok(())
52}