use crate::error::LaunchError;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct LibraryPath {
pub path: String,
pub name: String,
pub version: String,
}
pub const MIRRORS: &[&str] = &[
"https://maven.minecraftforge.net",
"https://maven.neoforged.net/releases",
"https://maven.creeperhost.net",
"https://libraries.minecraft.net",
"https://repo1.maven.org/maven2",
];
pub fn get_path_libraries(
main: &str,
native_string: Option<&str>,
force_ext: Option<&str>,
) -> Result<LibraryPath, LaunchError> {
let parts: Vec<&str> = main.splitn(5, ':').collect();
if parts.len() < 3 {
return Err(LaunchError::InvalidData(format!(
"invalid library coordinate (need group:artifact:version): '{main}'"
)));
}
let group = parts[0];
let artifact = parts[1];
let version = parts[2];
let classifier = parts.get(3).copied();
let file_name = match classifier {
Some(c) => format!("{version}-{c}"),
None => version.to_string(),
};
let final_file_name = if let Some(at) = file_name.find('@') {
let mut s = file_name.clone();
s.replace_range(at..=at, ".");
s
} else {
let native = native_string.unwrap_or("");
let ext = force_ext.unwrap_or(".jar");
format!("{file_name}{native}{ext}")
};
let version_dir = version.split('@').next().unwrap_or(version);
let path_lib = format!("{}/{artifact}/{version_dir}", group.replace('.', "/"));
Ok(LibraryPath {
path: path_lib,
name: format!("{artifact}-{final_file_name}"),
version: version.to_string(),
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn basic_coordinate() {
let r = get_path_libraries("net.minecraftforge:forge:1.19-41.0.63", None, None).unwrap();
assert_eq!(r.path, "net/minecraftforge/forge/1.19-41.0.63");
assert_eq!(r.name, "forge-1.19-41.0.63.jar");
assert_eq!(r.version, "1.19-41.0.63");
}
#[test]
fn with_native_string() {
let r =
get_path_libraries("net.java.dev.jna:jna:5.10.0", Some("-natives-linux"), None)
.unwrap();
assert_eq!(r.path, "net/java/dev/jna/jna/5.10.0");
assert_eq!(r.name, "jna-5.10.0-natives-linux.jar");
}
#[test]
fn with_classifier() {
let r =
get_path_libraries("some.group:artifact:1.0:natives-win", None, None).unwrap();
assert_eq!(r.name, "artifact-1.0-natives-win.jar");
}
#[test]
fn with_at_extension() {
let r = get_path_libraries("com.example:lib:1.0@zip", None, None).unwrap();
assert_eq!(r.name, "lib-1.0.zip");
assert_eq!(r.path, "com/example/lib/1.0");
}
#[test]
fn with_force_ext() {
let r = get_path_libraries("com.example:lib:2.0", None, Some(".zip")).unwrap();
assert_eq!(r.name, "lib-2.0.zip");
}
#[test]
fn malformed_coordinate_returns_error() {
assert!(get_path_libraries("no-colons-here", None, None).is_err());
assert!(get_path_libraries("only:one", None, None).is_err());
}
}