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; let actual: u32 = (3u32 << 16) | 7; let err = Error::InvalidVersion { expected, actual };
62 assert_eq!(err.to_string(), "invalid version; expected=1.0; found=3.7");
63 }
64}