lighty_version/
version_builder.rs1use std::{fmt::Debug,
2 path::{Path, PathBuf}
3};
4use once_cell::sync::Lazy;
5use directories::ProjectDirs;
6use lighty_loaders::types::VersionInfo;
7
8#[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 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 pub fn with_custom_game_dir(mut self, game_dir: PathBuf) -> Self {
66 self.game_dirs = game_dir;
67 self
68 }
69
70 pub fn with_custom_java_dir(mut self, java_dir: PathBuf) -> Self {
78 self.java_dirs = java_dir;
79 self
80 }
81
82 pub fn with_loader(mut self, loader: L) -> Self {
84 self.loader = loader;
85 self
86 }
87
88 pub fn with_loader_version(mut self, version: &str) -> Self {
90 self.loader_version = version.to_string();
91 self
92 }
93
94 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
129impl<'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}