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}