virtual_file_system/
error.rs

1use core::{fmt::Display, num::NonZeroU32};
2
3use embedded_io_async::ErrorKind;
4
5pub type Result<T> = core::result::Result<T, Error>;
6
7#[derive(Debug, PartialEq, Clone, Copy, Eq)]
8#[repr(u32)]
9pub enum Error {
10    AlreadyInitialized = 1,
11    UnavailableDriver,
12    InvalidFileSystem,
13    InvalidParameter,
14    TooManyOpenFiles,
15    FailedToGetTaskInformations,
16    InvalidIdentifier,
17    AlreadyExists,
18    Time(time::Error),
19    FileSystem(file_system::Error) = 0x100,
20    Users(users::Error) = 0x300,
21    Task(task::Error) = 0x400,
22    MissingAttribute,
23    InvalidPath,
24    PermissionDenied,
25    TooManyInodes,
26    RessourceBusy,
27    NotADirectory,
28    NotAFile,
29    InvalidInode,
30    InvalidMode,
31    InvalidOpen,
32    UnsupportedOperation,
33    FailedToWrite,
34    DelimiterNotFound,
35    Orphaned,
36}
37
38impl Error {
39    pub fn get_discriminant(&self) -> NonZeroU32 {
40        unsafe { *<*const _>::from(self).cast::<NonZeroU32>() }
41    }
42}
43
44impl From<Error> for NonZeroU32 {
45    fn from(value: Error) -> Self {
46        let discriminant = value.get_discriminant();
47
48        let offset = match value {
49            Error::FileSystem(error_type) => error_type.get_discriminant().get(),
50            _ => 0,
51        };
52
53        discriminant.saturating_add(offset)
54    }
55}
56
57impl From<users::Error> for Error {
58    fn from(value: users::Error) -> Self {
59        Self::Users(value)
60    }
61}
62
63impl From<time::Error> for Error {
64    fn from(value: time::Error) -> Self {
65        Self::Time(value)
66    }
67}
68
69impl From<file_system::Error> for Error {
70    fn from(value: file_system::Error) -> Self {
71        Self::FileSystem(value)
72    }
73}
74
75impl From<task::Error> for Error {
76    fn from(value: task::Error) -> Self {
77        Self::Task(value)
78    }
79}
80
81impl Display for Error {
82    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
83        match self {
84            Error::AlreadyInitialized => write!(f, "Already initialized"),
85            Error::UnavailableDriver => write!(f, "Unavailable driver"),
86            Error::InvalidFileSystem => write!(f, "Invalid file system"),
87            Error::InvalidParameter => write!(f, "Invalid parameter"),
88            Error::TooManyOpenFiles => write!(f, "Too many open files"),
89            Error::FailedToGetTaskInformations => {
90                write!(f, "Failed to get task informations")
91            }
92            Error::FileSystem(err) => write!(f, "File system error: {err}"),
93            Error::InvalidIdentifier => write!(f, "Invalid identifier"),
94            Error::AlreadyExists => write!(f, "Already exists"),
95            Error::Time(err) => write!(f, "Time error: {err}"),
96            Error::Users(err) => write!(f, "Users error: {err}"),
97            Error::Task(err) => write!(f, "Task error: {err}"),
98            Error::MissingAttribute => write!(f, "Missing attribute"),
99            Error::InvalidPath => write!(f, "Invalid path"),
100            Error::PermissionDenied => write!(f, "Permission denied"),
101            Error::TooManyInodes => write!(f, "Too many inodes"),
102            Error::RessourceBusy => write!(f, "Ressource busy"),
103            Error::NotADirectory => write!(f, "Not a directory"),
104            Error::NotAFile => write!(f, "Not a file"),
105            Error::InvalidMode => write!(f, "Invalid mode"),
106            Error::InvalidOpen => write!(f, "Invalid open"),
107            Error::InvalidInode => write!(f, "Invalid inode"),
108            Error::UnsupportedOperation => write!(f, "Unsupported operation"),
109            Error::FailedToWrite => write!(f, "Failed to write"),
110            Error::DelimiterNotFound => write!(f, "Delimiter not found"),
111            Error::Orphaned => write!(f, "Orphaned"),
112        }
113    }
114}
115
116impl core::error::Error for Error {}
117
118impl embedded_io_async::Error for Error {
119    fn kind(&self) -> ErrorKind {
120        match self {
121            Error::PermissionDenied => ErrorKind::PermissionDenied,
122            Error::NotADirectory => ErrorKind::InvalidInput,
123            Error::NotAFile => ErrorKind::InvalidInput,
124            Error::InvalidMode => ErrorKind::InvalidInput,
125            Error::InvalidOpen => ErrorKind::InvalidInput,
126            Error::UnsupportedOperation => ErrorKind::Unsupported,
127            _ => ErrorKind::Other,
128        }
129    }
130}