fs/
error.rs

1// SPDX-FileCopyrightText: 2023 Foundation Devices, Inc. <hello@foundation.xyz>
2// SPDX-License-Identifier: GPL-3.0-or-later
3
4use 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}