aboutsummaryrefslogtreecommitdiff
path: root/crates/msh-core/src/error.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/msh-core/src/error.rs')
-rw-r--r--crates/msh-core/src/error.rs74
1 files changed, 74 insertions, 0 deletions
diff --git a/crates/msh-core/src/error.rs b/crates/msh-core/src/error.rs
new file mode 100644
index 0000000..81fe54f
--- /dev/null
+++ b/crates/msh-core/src/error.rs
@@ -0,0 +1,74 @@
+use core::fmt;
+
+#[derive(Debug)]
+pub enum Error {
+ Nres(nres::error::Error),
+ MissingResource {
+ kind: u32,
+ label: &'static str,
+ },
+ InvalidResourceSize {
+ label: &'static str,
+ size: usize,
+ stride: usize,
+ },
+ InvalidRes2Size {
+ size: usize,
+ },
+ UnsupportedNodeStride {
+ stride: usize,
+ },
+ IndexOutOfBounds {
+ label: &'static str,
+ index: usize,
+ limit: usize,
+ },
+ IntegerOverflow,
+}
+
+impl From<nres::error::Error> for Error {
+ fn from(value: nres::error::Error) -> Self {
+ Self::Nres(value)
+ }
+}
+
+impl fmt::Display for Error {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match self {
+ Self::Nres(err) => write!(f, "{err}"),
+ Self::MissingResource { kind, label } => {
+ write!(f, "missing required resource type={kind} ({label})")
+ }
+ Self::InvalidResourceSize {
+ label,
+ size,
+ stride,
+ } => {
+ write!(
+ f,
+ "invalid {label} size={size}, expected multiple of stride={stride}"
+ )
+ }
+ Self::InvalidRes2Size { size } => {
+ write!(f, "invalid Res2 size={size}, expected >= 140")
+ }
+ Self::UnsupportedNodeStride { stride } => {
+ write!(
+ f,
+ "unsupported Res1 node stride={stride}, expected 38 or 24"
+ )
+ }
+ Self::IndexOutOfBounds {
+ label,
+ index,
+ limit,
+ } => write!(
+ f,
+ "{label} index out of bounds: index={index}, limit={limit}"
+ ),
+ Self::IntegerOverflow => write!(f, "integer overflow"),
+ }
+ }
+}
+
+impl std::error::Error for Error {}