minecraft_java_rs_core/utils/
paths.rs1use crate::error::LaunchError;
2
3#[derive(Debug, Clone, PartialEq, Eq)]
5pub struct LibraryPath {
6 pub path: String,
8 pub name: String,
10 pub version: String,
12}
13
14pub const MIRRORS: &[&str] = &[
16 "https://maven.minecraftforge.net",
17 "https://maven.neoforged.net/releases",
18 "https://maven.creeperhost.net",
19 "https://libraries.minecraft.net",
20 "https://repo1.maven.org/maven2",
21];
22
23pub fn get_path_libraries(
40 main: &str,
41 native_string: Option<&str>,
42 force_ext: Option<&str>,
43) -> Result<LibraryPath, LaunchError> {
44 let parts: Vec<&str> = main.splitn(5, ':').collect();
45 if parts.len() < 3 {
46 return Err(LaunchError::InvalidData(format!(
47 "invalid library coordinate (need group:artifact:version): '{main}'"
48 )));
49 }
50
51 let group = parts[0];
52 let artifact = parts[1];
53 let version = parts[2];
54 let classifier = parts.get(3).copied();
55
56 let file_name = match classifier {
58 Some(c) => format!("{version}-{c}"),
59 None => version.to_string(),
60 };
61
62 let final_file_name = if let Some(at) = file_name.find('@') {
65 let mut s = file_name.clone();
67 s.replace_range(at..=at, ".");
68 s
69 } else {
70 let native = native_string.unwrap_or("");
71 let ext = force_ext.unwrap_or(".jar");
72 format!("{file_name}{native}{ext}")
73 };
74
75 let version_dir = version.split('@').next().unwrap_or(version);
77 let path_lib = format!("{}/{artifact}/{version_dir}", group.replace('.', "/"));
78
79 Ok(LibraryPath {
80 path: path_lib,
81 name: format!("{artifact}-{final_file_name}"),
82 version: version.to_string(),
83 })
84}
85
86#[cfg(test)]
87mod tests {
88 use super::*;
89
90 #[test]
91 fn basic_coordinate() {
92 let r = get_path_libraries("net.minecraftforge:forge:1.19-41.0.63", None, None).unwrap();
93 assert_eq!(r.path, "net/minecraftforge/forge/1.19-41.0.63");
94 assert_eq!(r.name, "forge-1.19-41.0.63.jar");
95 assert_eq!(r.version, "1.19-41.0.63");
96 }
97
98 #[test]
99 fn with_native_string() {
100 let r =
101 get_path_libraries("net.java.dev.jna:jna:5.10.0", Some("-natives-linux"), None)
102 .unwrap();
103 assert_eq!(r.path, "net/java/dev/jna/jna/5.10.0");
104 assert_eq!(r.name, "jna-5.10.0-natives-linux.jar");
105 }
106
107 #[test]
108 fn with_classifier() {
109 let r =
110 get_path_libraries("some.group:artifact:1.0:natives-win", None, None).unwrap();
111 assert_eq!(r.name, "artifact-1.0-natives-win.jar");
112 }
113
114 #[test]
115 fn with_at_extension() {
116 let r = get_path_libraries("com.example:lib:1.0@zip", None, None).unwrap();
117 assert_eq!(r.name, "lib-1.0.zip");
118 assert_eq!(r.path, "com/example/lib/1.0");
120 }
121
122 #[test]
123 fn with_force_ext() {
124 let r = get_path_libraries("com.example:lib:2.0", None, Some(".zip")).unwrap();
125 assert_eq!(r.name, "lib-2.0.zip");
126 }
127
128 #[test]
129 fn malformed_coordinate_returns_error() {
130 assert!(get_path_libraries("no-colons-here", None, None).is_err());
131 assert!(get_path_libraries("only:one", None, None).is_err());
132 }
133}