This commit is contained in:
Robin Appelman 2024-08-30 22:37:38 +02:00
commit 7901957f3e
6 changed files with 332 additions and 146 deletions

View file

@ -8,6 +8,8 @@ use std::sync::Arc;
use steamlocate::SteamDir;
use thiserror::Error;
use tracing::warn;
#[cfg(feature = "bsp")]
use vbsp::BspError;
#[derive(Debug, Error)]
pub enum LoaderError {
@ -22,6 +24,17 @@ pub enum LoaderError {
Other(String),
}
#[cfg(feature = "bsp")]
impl From<BspError> for LoaderError {
fn from(value: BspError) -> Self {
match value {
BspError::Zip(err) => LoaderError::Zip(err),
BspError::IO(err) => LoaderError::Io(err),
err => LoaderError::Other(err.to_string()),
}
}
}
#[derive(Clone)]
pub struct Loader {
sources: Vec<Arc<dyn AssetSource + Send + Sync>>,
@ -120,11 +133,11 @@ fn tf2_path() -> Result<PathBuf, LoaderError> {
Err(LoaderError::Tf2NotFound)
}
} else {
Ok(SteamDir::locate()
.ok_or(LoaderError::Tf2NotFound)?
.app(&440)
.ok_or(LoaderError::Tf2NotFound)?
.path
.clone())
let (app, library) = SteamDir::locate()
.map_err(|_| LoaderError::Tf2NotFound)?
.find_app(440)
.map_err(|_| LoaderError::Tf2NotFound)?
.ok_or(LoaderError::Tf2NotFound)?;
Ok(library.resolve_app_dir(&app))
}
}

View file

@ -48,23 +48,15 @@ mod vdf {
mod vbsp {
use super::AssetSource;
use crate::LoaderError;
use vbsp::{BspError, Packfile};
use vbsp::Packfile;
impl AssetSource for Packfile {
fn has(&self, path: &str) -> Result<bool, LoaderError> {
match self.has(path) {
Ok(found) => Ok(found),
Err(BspError::Zip(err)) => Err(err.into()),
Err(e) => Err(LoaderError::Other(e.to_string())), // the error *should* always be a zip error
}
Ok(self.has(path)?)
}
fn load(&self, path: &str) -> Result<Option<Vec<u8>>, LoaderError> {
match self.get(path) {
Ok(data) => Ok(data),
Err(BspError::Zip(err)) => Err(err.into()),
Err(e) => Err(LoaderError::Other(e.to_string())), // the error *should* always be a zip error
}
Ok(self.get(path)?)
}
}
}
@ -82,12 +74,8 @@ mod zip {
fn has(&self, path: &str) -> Result<bool, LoaderError> {
match self.lock().unwrap().by_name(path) {
Ok(_) => Ok(true),
Err(ZipError::FileNotFound) => {
return Ok(false);
}
Err(e) => {
return Err(e.into());
}
Err(ZipError::FileNotFound) => Ok(false),
Err(e) => Err(e.into()),
}
}