virtual_file_system/
error.rs1use 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}