use std::{collections::HashMap, hash::BuildHasher, sync::Arc};
use camino::Utf8Path;
use ltk_hash::WadHash;
pub trait PathResolver {
fn resolve(&self, path_hash: WadHash) -> Option<String>;
fn is_known(&self, path_hash: WadHash) -> bool {
self.resolve(path_hash).is_some()
}
}
impl<R: PathResolver + ?Sized> PathResolver for &R {
fn resolve(&self, path_hash: WadHash) -> Option<String> {
(**self).resolve(path_hash)
}
fn is_known(&self, path_hash: WadHash) -> bool {
(**self).is_known(path_hash)
}
}
impl<R: PathResolver + ?Sized> PathResolver for Box<R> {
fn resolve(&self, path_hash: WadHash) -> Option<String> {
(**self).resolve(path_hash)
}
fn is_known(&self, path_hash: WadHash) -> bool {
(**self).is_known(path_hash)
}
}
impl<R: PathResolver + ?Sized> PathResolver for Arc<R> {
fn resolve(&self, path_hash: WadHash) -> Option<String> {
(**self).resolve(path_hash)
}
fn is_known(&self, path_hash: WadHash) -> bool {
(**self).is_known(path_hash)
}
}
impl<S: BuildHasher> PathResolver for HashMap<WadHash, String, S> {
fn resolve(&self, path_hash: WadHash) -> Option<String> {
self.get(&path_hash).cloned()
}
fn is_known(&self, path_hash: WadHash) -> bool {
self.contains_key(&path_hash)
}
}
#[derive(Debug, Clone, Copy, Default)]
pub struct NoResolver;
impl PathResolver for NoResolver {
fn resolve(&self, _path_hash: WadHash) -> Option<String> {
None
}
fn is_known(&self, _path_hash: WadHash) -> bool {
false
}
}
pub(crate) fn hex_name(path_hash: WadHash) -> String {
format!("{path_hash:016x}")
}
pub fn is_hex_chunk_path(path: &Utf8Path) -> bool {
let file_stem = path.file_stem().unwrap_or("");
file_stem.len() == 16 && file_stem.chars().all(|c| c.is_ascii_hexdigit())
}