Skip to main content

conduit_cli/core/domain/
loader.rs

1use 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}