1use num_derive::{FromPrimitive, ToPrimitive};
5use num_traits::{FromPrimitive, ToPrimitive};
6
7#[derive(
8 Debug, Clone, Copy, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize, ToPrimitive, FromPrimitive,
9)]
10pub enum Error {
11 Io = 1,
12 FileNotOpen,
13 InvalidBufferLength,
14 InvalidPath,
15 InvalidOperation,
16 FileNotFound,
17 FileAlreadyExists,
18 FileInUse,
19 NotADirectory,
20 NoMedia,
21 OutOfMemory,
22 AccessDenied,
23 InternalError,
24}
25
26impl server::AsScalar<1> for Error {
27 fn as_scalar(&self) -> [u32; 1] { [self.to_u32().unwrap()] }
28}
29
30impl server::FromScalar<1> for Error {
31 fn from_scalar([value]: [u32; 1]) -> Self { Self::from_u32(value).unwrap_or(Self::InternalError) }
32}
33
34impl From<Error> for usize {
35 fn from(value: Error) -> Self { value.to_usize().unwrap() }
36}
37
38impl From<usize> for Error {
39 fn from(value: usize) -> Self { Self::from_usize(value).unwrap_or(Self::InternalError) }
40}
41
42impl std::fmt::Display for Error {
43 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{self:?}") }
44}
45
46impl std::error::Error for Error {}
47
48impl From<std::io::Error> for Error {
49 fn from(e: std::io::Error) -> Self {
50 match e.kind() {
51 std::io::ErrorKind::NotFound => Error::FileNotFound,
52 std::io::ErrorKind::PermissionDenied => Error::AccessDenied,
53 std::io::ErrorKind::InvalidFilename => Error::InvalidPath,
54 std::io::ErrorKind::Unsupported => Error::InvalidOperation,
55 std::io::ErrorKind::ResourceBusy => Error::FileInUse,
56 std::io::ErrorKind::OutOfMemory => Error::OutOfMemory,
57 _ => Error::Io,
58 }
59 }
60}
61
62impl From<Error> for std::io::Error {
63 fn from(value: Error) -> Self {
64 std::io::Error::new(
65 match value {
66 Error::Io => std::io::ErrorKind::Other,
67 Error::FileNotOpen => std::io::ErrorKind::BrokenPipe,
68 Error::InvalidBufferLength => std::io::ErrorKind::InvalidInput,
69 Error::InvalidPath => std::io::ErrorKind::InvalidFilename,
70 Error::InvalidOperation => std::io::ErrorKind::Unsupported,
71 Error::FileNotFound => std::io::ErrorKind::NotFound,
72 Error::FileAlreadyExists => std::io::ErrorKind::AlreadyExists,
73 Error::FileInUse => std::io::ErrorKind::ResourceBusy,
74 Error::NotADirectory => std::io::ErrorKind::NotADirectory,
75 Error::NoMedia => std::io::ErrorKind::NotFound,
76 Error::OutOfMemory => std::io::ErrorKind::OutOfMemory,
77 Error::InternalError => std::io::ErrorKind::Other,
78 Error::AccessDenied => std::io::ErrorKind::PermissionDenied,
79 },
80 value,
81 )
82 }
83}
84
85impl From<xous::Error> for Error {
86 fn from(value: xous::Error) -> Self {
87 match value {
88 xous::Error::OutOfMemory => Self::OutOfMemory,
89 xous::Error::AccessDenied => Self::AccessDenied,
90 _ => Self::InternalError,
91 }
92 }
93}