fixed moduleConfig.xml being case insesitive

This commit is contained in:
2026-03-02 21:27:06 +01:00
parent 217d2303a6
commit ed87dc1ca9
2 changed files with 39 additions and 1 deletions

View File

@@ -9,6 +9,7 @@ use crate::{
linker::{create_plugins_txt, link_game_to_target, link_instance_to_target},
load_order::LoadOrder,
mod_config_installer::FomodInstaller,
utils::resolve_case_insensitive,
};
mod basic_types;
@@ -22,7 +23,7 @@ mod mod_config_installer;
mod utils;
pub fn load_mod_config(mod_root: impl AsRef<Path>) -> Result<fomod::Config, Box<dyn Error>> {
let path = mod_root.as_ref().join("FOMod/ModuleConfig.xml");
let path = resolve_case_insensitive(&mod_root, "fomod/ModuleConfig.xml")?;
let mod_config = Config::load_from_file(path)?;
Ok(mod_config)
}

View File

@@ -1,5 +1,6 @@
use std::{
fs::{self, DirEntry},
io,
path::{Path, PathBuf},
};
@@ -29,3 +30,39 @@ pub fn walk_files_recursive(
pub fn path_to_lowercase(path: impl AsRef<Path>) -> PathBuf {
PathBuf::from(path.as_ref().to_string_lossy().to_lowercase())
}
pub fn resolve_case_insensitive(
base: impl AsRef<Path>,
rel: impl AsRef<Path>,
) -> io::Result<PathBuf> {
let mut current = base.as_ref().to_path_buf();
for part in rel.as_ref().iter() {
let target = part.to_string_lossy();
let mut found = None;
for entry in fs::read_dir(&current)? {
let entry = entry?;
let name = entry.file_name();
let name = name.to_string_lossy();
if name.eq_ignore_ascii_case(&target) {
found = Some(entry.path());
break;
}
}
match found {
Some(path) => current = path,
None => {
return Err(io::Error::new(
io::ErrorKind::NotFound,
format!("Path component not found: {}", target),
));
}
}
}
Ok(current)
}