diff --git a/psoutils/src/quest.rs b/psoutils/src/quest.rs index 7ed26ab..947df61 100644 --- a/psoutils/src/quest.rs +++ b/psoutils/src/quest.rs @@ -2,10 +2,8 @@ use std::path::Path; use thiserror::Error; -use crate::bytes::{ReadBytesError, WriteBytesError}; -use crate::quest::bin::QuestBin; -use crate::quest::dat::QuestDat; -use crate::text::LanguageError; +use crate::quest::bin::{QuestBin, QuestBinError}; +use crate::quest::dat::{QuestDat, QuestDatError}; pub mod bin; pub mod dat; @@ -15,14 +13,11 @@ pub enum QuestError { #[error("I/O error reading quest")] IoError(#[from] std::io::Error), - #[error("String encoding error during processing of quest string field")] - StringEncodingError(#[from] LanguageError), + #[error("Error processing quest bin")] + QuestBinError(#[from] QuestBinError), - #[error("Error reading quest from bytes")] - ReadFromBytesError(#[from] ReadBytesError), - - #[error("Error writing quest as bytes")] - WriteAsBytesError(#[from] WriteBytesError), + #[error("Error processing quest dat")] + QuestDatError(#[from] QuestDatError), } pub struct Quest { diff --git a/psoutils/src/quest/bin.rs b/psoutils/src/quest/bin.rs index f6cd511..5e546f4 100644 --- a/psoutils/src/quest/bin.rs +++ b/psoutils/src/quest/bin.rs @@ -3,11 +3,11 @@ use std::io::{BufReader, Cursor, Read}; use std::path::Path; use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt}; +use thiserror::Error; use crate::bytes::*; use crate::compression::{prs_compress, prs_decompress}; -use crate::quest::QuestError; -use crate::text::Language; +use crate::text::{Language, LanguageError}; pub const QUEST_BIN_NAME_LENGTH: usize = 32; pub const QUEST_BIN_SHORT_DESCRIPTION_LENGTH: usize = 128; @@ -18,6 +18,21 @@ pub const QUEST_BIN_HEADER_SIZE: usize = 20 + QUEST_BIN_SHORT_DESCRIPTION_LENGTH + QUEST_BIN_LONG_DESCRIPTION_LENGTH; +#[derive(Error, Debug)] +pub enum QuestBinError { + #[error("I/O error while processing quest bin")] + IoError(#[from] std::io::Error), + + #[error("String encoding error during processing of quest bin string field")] + StringEncodingError(#[from] LanguageError), + + #[error("Error reading quest bin from bytes")] + ReadFromBytesError(#[from] ReadBytesError), + + #[error("Error writing quest bin as bytes")] + WriteAsBytesError(#[from] WriteBytesError), +} + #[derive(Copy, Clone)] pub struct QuestNumberAndEpisode { pub number: u8, @@ -65,20 +80,20 @@ pub struct QuestBin { } impl QuestBin { - pub fn from_compressed_bytes(bytes: &[u8]) -> Result { + pub fn from_compressed_bytes(bytes: &[u8]) -> Result { let decompressed = prs_decompress(&bytes); let mut reader = Cursor::new(decompressed); Ok(QuestBin::read_from_bytes(&mut reader)?) } - pub fn from_compressed_file(path: &Path) -> Result { + pub fn from_compressed_file(path: &Path) -> Result { let mut file = File::open(path)?; let mut buffer = Vec::new(); file.read_to_end(&mut buffer)?; QuestBin::from_compressed_bytes(&buffer) } - pub fn from_uncompressed_file(path: &Path) -> Result { + pub fn from_uncompressed_file(path: &Path) -> Result { let file = File::open(path)?; let mut reader = BufReader::new(file); Ok(QuestBin::read_from_bytes(&mut reader)?) @@ -310,7 +325,7 @@ mod tests { } #[test] - pub fn read_compressed_quest_58_bin() -> Result<(), QuestError> { + pub fn read_compressed_quest_58_bin() -> Result<(), QuestBinError> { let path = Path::new("assets/test/q058-ret-gc.bin"); let bin = QuestBin::from_compressed_file(&path)?; validate_quest_58_bin(&bin); @@ -318,7 +333,7 @@ mod tests { } #[test] - pub fn read_uncompressed_quest_58_bin() -> Result<(), QuestError> { + pub fn read_uncompressed_quest_58_bin() -> Result<(), QuestBinError> { let path = Path::new("assets/test/q058-ret-gc.uncompressed.bin"); let bin = QuestBin::from_uncompressed_file(&path)?; validate_quest_58_bin(&bin); @@ -326,7 +341,7 @@ mod tests { } #[test] - pub fn read_compressed_quest_118_bin() -> Result<(), QuestError> { + pub fn read_compressed_quest_118_bin() -> Result<(), QuestBinError> { let path = Path::new("assets/test/q118-vr-gc.bin"); let bin = QuestBin::from_compressed_file(&path)?; validate_quest_118_bin(&bin); @@ -334,7 +349,7 @@ mod tests { } #[test] - pub fn read_uncompressed_quest_118_bin() -> Result<(), QuestError> { + pub fn read_uncompressed_quest_118_bin() -> Result<(), QuestBinError> { let path = Path::new("assets/test/q118-vr-gc.uncompressed.bin"); let bin = QuestBin::from_uncompressed_file(&path)?; validate_quest_118_bin(&bin); diff --git a/psoutils/src/quest/dat.rs b/psoutils/src/quest/dat.rs index 6d90f16..3a0b196 100644 --- a/psoutils/src/quest/dat.rs +++ b/psoutils/src/quest/dat.rs @@ -4,10 +4,11 @@ use std::io::{BufReader, Cursor, Read}; use std::path::Path; use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt}; +use thiserror::Error; use crate::bytes::*; use crate::compression::{prs_compress, prs_decompress}; -use crate::quest::QuestError; +use crate::text::LanguageError; pub const QUEST_DAT_TABLE_HEADER_SIZE: usize = 16; @@ -54,6 +55,21 @@ pub const QUEST_DAT_AREAS: [[&str; 18]; 2] = [ ], ]; +#[derive(Error, Debug)] +pub enum QuestDatError { + #[error("I/O error while processing quest dat")] + IoError(#[from] std::io::Error), + + #[error("String encoding error during processing of quest dat string field")] + StringEncodingError(#[from] LanguageError), + + #[error("Error reading quest dat from bytes")] + ReadFromBytesError(#[from] ReadBytesError), + + #[error("Error writing quest dat as bytes")] + WriteAsBytesError(#[from] WriteBytesError), +} + #[derive(Debug, Eq, PartialEq, Copy, Clone)] pub enum QuestDatTableType { Object, @@ -154,20 +170,20 @@ pub struct QuestDat { } impl QuestDat { - pub fn from_compressed_bytes(bytes: &[u8]) -> Result { + pub fn from_compressed_bytes(bytes: &[u8]) -> Result { let decompressed = prs_decompress(&bytes); let mut reader = Cursor::new(decompressed); Ok(QuestDat::read_from_bytes(&mut reader)?) } - pub fn from_compressed_file(path: &Path) -> Result { + pub fn from_compressed_file(path: &Path) -> Result { let mut file = File::open(path)?; let mut buffer = Vec::new(); file.read_to_end(&mut buffer)?; QuestDat::from_compressed_bytes(&buffer) } - pub fn from_uncompressed_file(path: &Path) -> Result { + pub fn from_uncompressed_file(path: &Path) -> Result { let file = File::open(path)?; let mut reader = BufReader::new(file); Ok(QuestDat::read_from_bytes(&mut reader)?) @@ -489,7 +505,7 @@ mod tests { } #[test] - pub fn read_compressed_quest_58_dat() -> Result<(), QuestError> { + pub fn read_compressed_quest_58_dat() -> Result<(), QuestDatError> { let path = Path::new("assets/test/q058-ret-gc.dat"); let dat = QuestDat::from_compressed_file(&path)?; validate_quest_58_dat(&dat); @@ -497,7 +513,7 @@ mod tests { } #[test] - pub fn read_uncompressed_quest_58_dat() -> Result<(), QuestError> { + pub fn read_uncompressed_quest_58_dat() -> Result<(), QuestDatError> { let path = Path::new("assets/test/q058-ret-gc.uncompressed.dat"); let dat = QuestDat::from_uncompressed_file(&path)?; validate_quest_58_dat(&dat); @@ -505,7 +521,7 @@ mod tests { } #[test] - pub fn read_compressed_quest_118_dat() -> Result<(), QuestError> { + pub fn read_compressed_quest_118_dat() -> Result<(), QuestDatError> { let path = Path::new("assets/test/q118-vr-gc.dat"); let dat = QuestDat::from_compressed_file(&path)?; validate_quest_118_dat(&dat); @@ -513,7 +529,7 @@ mod tests { } #[test] - pub fn read_uncompressed_quest_118_dat() -> Result<(), QuestError> { + pub fn read_uncompressed_quest_118_dat() -> Result<(), QuestDatError> { let path = Path::new("assets/test/q118-vr-gc.uncompressed.dat"); let dat = QuestDat::from_uncompressed_file(&path)?; validate_quest_118_dat(&dat);