aboutsummaryrefslogtreecommitdiff
path: root/crates/msh-core/src/error.rs
blob: 81fe54f9298c3d5fcc60d2388b7e7a306a411f1c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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 {}