lighty_version/
version_builder.rs

1use std::{fmt::Debug,
2          path::{Path, PathBuf}
3};
4use once_cell::sync::Lazy;
5use directories::ProjectDirs;
6use lighty_loaders::types::VersionInfo;
7
8/// Structure principale pour configurer une version Minecraft avec un loader
9///
10/// # Exemples
11///
12/// ```rust
13/// use lighty_version::VersionBuilder;
14/// use lighty_loaders::types::Loader;
15///
16/// let builder = VersionBuilder::new("my-profile", Loader::Vanilla, "0.15.0", "1.20.1", &PROJECT_DIRS);
17///
18/// // Ou avec le builder pattern:
19/// let builder = VersionBuilder::new("my-profile", Loader::Vanilla, "0.15.0", "1.20.1", &PROJECT_DIRS)
20///     .with_custom_game_dir(PathBuf::from("./games"))
21///     .with_custom_java_dir(PathBuf::from("./java"));
22/// ```
23#[derive(Debug, Clone)]
24pub struct VersionBuilder<'a, L = ()> {
25    pub name: String,
26    pub loader: L,
27    pub loader_version: String,
28    pub minecraft_version: String,
29    pub project_dirs: &'a Lazy<ProjectDirs>,
30    pub game_dirs: PathBuf,
31    pub java_dirs: PathBuf,
32}
33
34impl<'a, L> VersionBuilder<'a, L> {
35    /// Crée un nouveau VersionBuilder avec les paramètres par défaut
36    ///
37    /// Les répertoires par défaut sont :
38    /// - `game_dirs`: `{data_dir}/{name}`
39    /// - `java_dirs`: `{config_dir}/jre`
40    pub fn new(
41        name: &str,
42        loader: L,
43        loader_version: &str,
44        minecraft_version: &str,
45        project_dirs: &'a Lazy<ProjectDirs>,
46    ) -> Self {
47        Self {
48            name: name.to_string(),
49            loader,
50            loader_version: loader_version.to_string(),
51            minecraft_version: minecraft_version.to_string(),
52            project_dirs,
53            game_dirs: project_dirs.data_dir().join(name),
54            java_dirs: project_dirs.config_dir().to_path_buf().join("jre"),
55        }
56    }
57
58    /// Définit un répertoire de jeu personnalisé
59    ///
60    /// # Exemple
61    /// ```rust
62    /// let builder = VersionBuilder::new(...)
63    ///     .with_custom_game_dir(PathBuf::from("./custom/games"));
64    /// ```
65    pub fn with_custom_game_dir(mut self, game_dir: PathBuf) -> Self {
66        self.game_dirs = game_dir;
67        self
68    }
69
70    /// Définit un répertoire Java personnalisé
71    ///
72    /// # Exemple
73    /// ```rust
74    /// let builder = VersionBuilder::new(...)
75    ///     .with_custom_java_dir(PathBuf::from("./custom/java"));
76    /// ```
77    pub fn with_custom_java_dir(mut self, java_dir: PathBuf) -> Self {
78        self.java_dirs = java_dir;
79        self
80    }
81
82    /// Change le loader
83    pub fn with_loader(mut self, loader: L) -> Self {
84        self.loader = loader;
85        self
86    }
87
88    /// Change la version du loader
89    pub fn with_loader_version(mut self, version: &str) -> Self {
90        self.loader_version = version.to_string();
91        self
92    }
93
94    /// Change la version de Minecraft
95    pub fn with_minecraft_version(mut self, version: &str) -> Self {
96        self.minecraft_version = version.to_string();
97        self
98    }
99}
100
101impl<'a, L: Clone + Send + Sync + Debug> VersionInfo for VersionBuilder<'a, L> {
102    type LoaderType = L;
103
104    fn name(&self) -> &str {
105        &self.name
106    }
107
108    fn loader_version(&self) -> &str {
109        &self.loader_version
110    }
111
112    fn minecraft_version(&self) -> &str {
113        &self.minecraft_version
114    }
115
116    fn game_dirs(&self) -> &Path {
117        &self.game_dirs
118    }
119
120    fn java_dirs(&self) -> &Path {
121        &self.java_dirs
122    }
123
124    fn loader(&self) -> &Self::LoaderType {
125        &self.loader
126    }
127}
128
129// Implémentation pour &VersionBuilder (permet de passer des références)
130impl<'a, 'b, L: Clone + Send + Sync + Debug> VersionInfo for &'b VersionBuilder<'a, L> {
131    type LoaderType = L;
132
133    fn name(&self) -> &str {
134        &self.name
135    }
136
137    fn loader_version(&self) -> &str {
138        &self.loader_version
139    }
140
141    fn minecraft_version(&self) -> &str {
142        &self.minecraft_version
143    }
144
145    fn game_dirs(&self) -> &Path {
146        &self.game_dirs
147    }
148
149    fn java_dirs(&self) -> &Path {
150        &self.java_dirs
151    }
152
153    fn loader(&self) -> &Self::LoaderType {
154        &self.loader
155    }
156}