PatchBukkit/rust/src/java/resources.rs
Alexander Medvedev 6de65a0f3f Initial commit
Co-Authored-By: Bjorn Beishline <75190918+bjorntheprogrammer@users.noreply.github.com>
2026-01-21 19:20:07 +01:00

63 lines
1.9 KiB
Rust

use std::{collections::HashSet, fs, path::PathBuf};
use rust_embed::Embed;
#[derive(Embed)]
#[folder = "resources/"]
pub struct Resources;
pub fn cleanup_stale_files(j4rs_folder: &PathBuf) {
let allowed: HashSet<String> = Resources::iter().map(|p| p.to_string()).collect();
for entry in walkdir::WalkDir::new(j4rs_folder)
.into_iter()
.filter_map(|e| e.ok())
.filter(|e| e.file_type().is_file())
{
let rel_path = entry
.path()
.strip_prefix(j4rs_folder)
.unwrap()
.to_string_lossy()
.to_string();
if !allowed.contains(&rel_path) {
log::warn!("Removing stale j4rs file: {rel_path}");
let _ = fs::remove_file(entry.path());
}
}
}
pub fn sync_embedded_resources(j4rs_folder: &PathBuf) -> Result<(), String> {
for resource_path_str in Resources::iter() {
let resource_path = j4rs_folder.join(resource_path_str.to_string());
let resource = Resources::get(&resource_path_str).unwrap();
if !resource_path.exists() {
write_resource(&resource_path, &resource.data)?;
} else {
update_resource_if_changed(&resource_path, &resource.data)?;
}
}
Ok(())
}
fn write_resource(path: &PathBuf, data: &[u8]) -> Result<(), String> {
let parent = path.parent().ok_or("Resource has no parent directory")?;
fs::create_dir_all(parent)
.map_err(|err| format!("Failed to create parent for resource: {:?}", err))?;
fs::write(path, data).map_err(|err| format!("Failed to add resource: {:?}", err))
}
fn update_resource_if_changed(path: &PathBuf, new_data: &[u8]) -> Result<(), String> {
let old_data = fs::read(path).map_err(|err| format!("Failed to read resource: {:?}", err))?;
if new_data != old_data {
fs::write(path, new_data).map_err(|err| format!("Failed to update resource: {:?}", err))?;
}
Ok(())
}