virtual_file_system/
error.rs

1use core::{fmt::Display, num::NonZeroU32};
2
3pub type Result<T> = core::result::Result<T, Error>;
4
5#[derive(Debug, PartialEq, Clone, Copy, Eq)]
6#[repr(u32)]
7pub enum Error {
8    AlreadyInitialized = 1,
9    UnavailableDriver,
10    InvalidFileSystem,
11    InvalidParameter,
12    TooManyOpenFiles,
13    FailedToGetTaskInformations,
14    FileSystem(file_system::Error) = 0xFF,
15    Network(network::Error) = 0x200,
16}
17
18impl Error {
19    pub fn get_discriminant(&self) -> NonZeroU32 {
20        unsafe { *<*const _>::from(self).cast::<NonZeroU32>() }
21    }
22}
23
24impl From<Error> for NonZeroU32 {
25    fn from(value: Error) -> Self {
26        let discriminant = value.get_discriminant();
27
28        let offset = match value {
29            Error::FileSystem(error_type) => error_type.get_discriminant().get(),
30            Error::Network(error_type) => error_type.get_discriminant().get() as u32,
31            _ => 0,
32        };
33
34        discriminant.saturating_add(offset)
35    }
36}
37
38impl From<file_system::Error> for Error {
39    fn from(value: file_system::Error) -> Self {
40        Self::FileSystem(value)
41    }
42}
43
44impl From<network::Error> for Error {
45    fn from(value: network::Error) -> Self {
46        Self::Network(value)
47    }
48}
49
50impl Display for Error {
51    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
52        match self {
53            Error::AlreadyInitialized => write!(f, "Already initialized"),
54            Error::UnavailableDriver => write!(f, "Unavailable driver"),
55            Error::InvalidFileSystem => write!(f, "Invalid file system"),
56            Error::InvalidParameter => write!(f, "Invalid parameter"),
57            Error::TooManyOpenFiles => write!(f, "Too many open files"),
58            Error::FailedToGetTaskInformations => {
59                write!(f, "Failed to get task informations")
60            }
61            Error::FileSystem(err) => write!(f, "File system error: {err}"),
62            Error::Network(err) => write!(f, "Network error: {err}"),
63        }
64    }
65}