Skip to main content

ax_std/
error.rs

1use ax_api::ApiError;
2use ax_io::IoError;
3#[cfg(all(feature = "std-compat", feature = "fs"))]
4use syscalls::Errno;
5
6/// Errors owned by the ArceOS standard-library facade.
7#[derive(Clone, Copy, Debug, Eq, PartialEq, thiserror::Error)]
8pub enum StdError {
9    /// A public ArceOS API operation failed.
10    #[error(transparent)]
11    Api(#[from] ApiError),
12    /// An `ax-io` operation failed while implementing a standard-library action.
13    #[error(transparent)]
14    Io(#[from] IoError),
15    /// Address resolution yielded no usable socket address.
16    #[error("address resolution yielded no socket addresses")]
17    NoResolvedAddress,
18    /// A socket address string has invalid syntax.
19    #[error("invalid socket address")]
20    InvalidSocketAddress,
21    /// A socket port string is not a valid `u16` value.
22    #[error("invalid socket port")]
23    InvalidSocketPort,
24    /// A datagram send operation has no destination address.
25    #[error("no destination address was provided")]
26    MissingDestinationAddress,
27    /// Recursive directory creation is not implemented by this facade.
28    #[error("recursive directory creation is not supported")]
29    RecursiveDirectoryCreationUnsupported,
30    /// A joined task exited without publishing its return value.
31    #[error("thread exited without publishing its result")]
32    ThreadResultUnavailable,
33    /// The runtime reported no available CPU.
34    #[error("the runtime reported no available CPUs")]
35    NoAvailableCpu,
36}
37
38/// A result returned by an ArceOS standard-library facade operation.
39pub type StdResult<T = ()> = Result<T, StdError>;
40
41#[cfg(all(feature = "std-compat", feature = "fs"))]
42pub(crate) fn api_error_to_errno(error: ApiError) -> Errno {
43    io_error_to_errno(error.into())
44}
45
46#[cfg(all(feature = "std-compat", feature = "fs"))]
47fn io_error_to_errno(error: IoError) -> Errno {
48    match error {
49        IoError::AddrInUse => Errno::EADDRINUSE,
50        IoError::AlreadyConnected => Errno::EISCONN,
51        IoError::AddressFamilyUnsupported => Errno::EAFNOSUPPORT,
52        IoError::AlreadyExists => Errno::EEXIST,
53        IoError::ArgumentListTooLong => Errno::E2BIG,
54        IoError::BadAddress | IoError::BadState => Errno::EFAULT,
55        IoError::BadFileDescriptor => Errno::EBADF,
56        IoError::BrokenPipe => Errno::EPIPE,
57        IoError::ConnectionRefused => Errno::ECONNREFUSED,
58        IoError::ConnectionReset => Errno::ECONNRESET,
59        IoError::CrossesDevices => Errno::EXDEV,
60        IoError::DirectoryNotEmpty => Errno::ENOTEMPTY,
61        IoError::DestAddrRequired => Errno::EDESTADDRREQ,
62        IoError::FilesystemLoop => Errno::ELOOP,
63        IoError::FileTooLarge => Errno::EFBIG,
64        IoError::IllegalBytes => Errno::EILSEQ,
65        IoError::InProgress => Errno::EINPROGRESS,
66        IoError::Interrupted => Errno::EINTR,
67        IoError::InvalidData | IoError::InvalidInput => Errno::EINVAL,
68        IoError::InvalidExecutable => Errno::ENOEXEC,
69        IoError::Io | IoError::UnexpectedEof | IoError::WriteZero => Errno::EIO,
70        IoError::IsADirectory => Errno::EISDIR,
71        IoError::MessageTooLong => Errno::EMSGSIZE,
72        IoError::NameTooLong => Errno::ENAMETOOLONG,
73        IoError::NoMemory => Errno::ENOMEM,
74        IoError::NoSuchDevice => Errno::ENODEV,
75        IoError::NoSuchDeviceOrAddress => Errno::ENXIO,
76        IoError::NoSuchProcess => Errno::ESRCH,
77        IoError::NotADirectory => Errno::ENOTDIR,
78        IoError::NotASocket => Errno::ENOTSOCK,
79        IoError::NotATty => Errno::ENOTTY,
80        IoError::NotConnected => Errno::ENOTCONN,
81        IoError::NotFound => Errno::ENOENT,
82        IoError::OperationNotPermitted => Errno::EPERM,
83        IoError::OperationNotSupported => Errno::EOPNOTSUPP,
84        IoError::OutOfRange => Errno::ERANGE,
85        IoError::PermissionDenied => Errno::EACCES,
86        IoError::ProtocolOptionUnsupported => Errno::ENOPROTOOPT,
87        IoError::ReadOnlyFilesystem => Errno::EROFS,
88        IoError::ResourceBusy => Errno::EBUSY,
89        IoError::StorageFull => Errno::ENOSPC,
90        IoError::TimedOut => Errno::ETIMEDOUT,
91        IoError::TooManyOpenFiles => Errno::EMFILE,
92        IoError::Unsupported => Errno::ENOSYS,
93        IoError::WouldBlock => Errno::EAGAIN,
94    }
95}