Skip to main content

rts_alloc/
error.rs

1use std::fmt::Display;
2
3#[derive(Debug)]
4pub enum Error {
5    InvalidMagic,
6    InvalidVersion { expected: u32, actual: u32 },
7    InvalidSlabSize,
8    InvalidNumWorkers,
9    InvalidWorkerIndex,
10    HeaderMismatch,
11    NoAvailableWorkers,
12    InvalidFileSize,
13    AlreadyInitialized,
14    InvalidHeader,
15    IoError(std::io::Error),
16    MmapError(std::io::Error),
17}
18
19impl std::error::Error for Error {}
20
21impl Display for Error {
22    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
23        match self {
24            Self::InvalidMagic => write!(f, "invalid magic"),
25            Self::InvalidVersion { expected, actual } => write!(
26                f,
27                "invalid version; expected={}.{}; found={}.{}",
28                expected >> 16,
29                expected & 0xFFFF,
30                actual >> 16,
31                actual & 0xFFFF,
32            ),
33            Self::InvalidSlabSize => write!(f, "invalid slab size"),
34            Self::InvalidNumWorkers => write!(f, "invalid num workers"),
35            Self::InvalidWorkerIndex => write!(f, "invalid worker index"),
36            Self::HeaderMismatch => write!(f, "header mismatch"),
37            Self::NoAvailableWorkers => write!(f, "no available workers"),
38            Self::InvalidFileSize => write!(f, "invalid file size"),
39            Self::AlreadyInitialized => write!(f, "already initialized"),
40            Self::InvalidHeader => write!(f, "invalid header"),
41            Self::IoError(err) => write!(f, "io error; err={err}"),
42            Self::MmapError(err) => write!(f, "mmap error; err={err}"),
43        }
44    }
45}
46
47impl From<std::io::Error> for Error {
48    fn from(value: std::io::Error) -> Self {
49        Self::IoError(value)
50    }
51}
52
53#[cfg(test)]
54mod tests {
55    use super::*;
56
57    #[test]
58    fn test_invalid_version_display() {
59        let expected: u32 = 1u32 << 16; // 1.0
60        let actual: u32 = (3u32 << 16) | 7; // 3.7
61        let err = Error::InvalidVersion { expected, actual };
62        assert_eq!(err.to_string(), "invalid version; expected=1.0; found=3.7");
63    }
64}