conduit_cli/core/domain/
loader.rs1use serde::{Deserialize, Serialize};
2use strum::Display;
3
4use crate::errors::ConduitError;
5
6#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Display)]
7#[serde(tag = "loader_type", rename_all = "snake_case")]
8pub enum Loader {
9 Vanilla,
10 Neoforge { version: String },
11 Fabric,
12 Forge { version: String },
13 Paper,
14 Purpur,
15}
16
17impl Loader {
18 pub fn pretty_name(&self) -> String {
19 match self {
20 Loader::Vanilla => "Vanilla".to_string(),
21 Loader::Fabric => "Fabric".to_string(),
22 Loader::Paper => "Paper".to_string(),
23 Loader::Purpur => "Purpur".to_string(),
24 Loader::Neoforge { version } => format!("NeoForge ({version})"),
25 Loader::Forge { version } => format!("Forge ({version})"),
26 }
27 }
28
29 pub fn from_string(name: &str, version: Option<&str>) -> Result<Self, ConduitError> {
30 let name_lower = name.to_lowercase();
31
32 match name_lower.as_str() {
33 "vanilla" => Ok(Loader::Vanilla),
34 "fabric" => Ok(Loader::Fabric),
35 "paper" => Ok(Loader::Paper),
36 "purpur" => Ok(Loader::Purpur),
37 "neoforge" | "forge" => {
38 let v = version.ok_or_else(|| {
39 ConduitError::Validation(format!(
40 "Loader {name} requires a version (e.g. {name}@version)"
41 ))
42 })?;
43
44 if name_lower == "neoforge" {
45 Ok(Loader::Neoforge {
46 version: v.to_string(),
47 })
48 } else {
49 Ok(Loader::Forge {
50 version: v.to_string(),
51 })
52 }
53 }
54 _ => Err(ConduitError::Unsupported(name.to_string())),
55 }
56 }
57}