mod resolver;
pub use resolver::ResourceResolver;
mod sqpack;
pub use sqpack::SqPackResource;
mod unpacked;
pub use unpacked::UnpackedResource;
use crate::{ByteBuffer, common::Language, exd::EXD, exh::EXH, exl::EXL};
pub trait Resource {
fn read(&mut self, path: &str) -> Option<ByteBuffer>;
fn exists(&mut self, path: &str) -> bool;
}
pub fn read_excel_sheet_header<T: Resource>(resource: &mut T, name: &str) -> Option<EXH> {
let root_exl_file = resource.read("exd/root.exl")?;
let root_exl = EXL::from_existing(&root_exl_file)?;
for (row, _) in root_exl.entries {
if row == name {
let new_filename = name.to_lowercase();
let path = format!("exd/{new_filename}.exh");
return EXH::from_existing(&resource.read(&path)?);
}
}
None
}
pub fn get_all_sheet_names<T: Resource>(resource: &mut T) -> Option<Vec<String>> {
let root_exl_file = resource.read("exd/root.exl")?;
let root_exl = EXL::from_existing(&root_exl_file)?;
let mut names = vec![];
for (row, _) in root_exl.entries {
names.push(row);
}
Some(names)
}
pub fn read_excel_sheet<T: Resource>(
resource: &mut T,
name: &str,
exh: &EXH,
language: Language,
page: usize,
) -> Option<EXD> {
let exd_path = format!(
"exd/{}",
EXD::calculate_filename(name, language, &exh.pages[page])
);
let exd_file = resource.read(&exd_path)?;
EXD::from_existing(exh, &exd_file)
}