use serde::{Deserialize, Serialize};
use std::path::{Path, PathBuf};
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct FabricLibrary {
pub name: String,
pub url: String,
}
impl FabricLibrary {
pub fn jar_name(&self) -> String {
let split = self.split_name();
let parts = split.iter().skip(1).take(2).cloned();
let suffixes = split.iter().skip(3).cloned();
let mut name = vec![];
name.extend(parts);
name.extend(suffixes);
let mut name = name.join("-");
name.push_str(".jar");
name
}
pub fn library_path(&self, libraries_path: impl AsRef<Path>) -> PathBuf {
let mut library_path = PathBuf::from(libraries_path.as_ref());
library_path.push(self.relative_library_path());
library_path
}
pub fn relative_library_path(&self) -> PathBuf {
let path_parts = self.split_name().into_iter().take(3);
let mut library_path = PathBuf::new();
for (i, path_part) in path_parts.enumerate() {
let part = match i {
0 => path_part.replace('.', "/"),
_ => path_part,
};
library_path.push(part);
}
library_path
}
pub fn jar_path(&self, libraries_path: impl AsRef<Path>) -> PathBuf {
let mut jar_path = self.library_path(&libraries_path);
jar_path.push(self.jar_name());
jar_path
}
pub fn relative_jar_path(&self) -> PathBuf {
let mut jar_path = self.relative_library_path();
jar_path.push(self.jar_name());
jar_path
}
pub fn download_url(&self) -> String {
let parts = self.split_name().into_iter().take(3);
let mut base_url = self.url.clone();
if base_url.ends_with('/') {
base_url.pop();
}
let mut url = vec![base_url];
for (i, part) in parts.enumerate() {
if i == 0 {
url.push(part.replace('.', "/"));
} else {
url.push(part);
}
}
url.push(self.jar_name());
url.join("/")
}
fn split_name(&self) -> Vec<String> {
self.name.split(':').map(String::from).collect()
}
}