1use ax_api::ApiError;
2use ax_io::IoError;
3#[cfg(all(feature = "std-compat", feature = "fs"))]
4use syscalls::Errno;
5
6#[derive(Clone, Copy, Debug, Eq, PartialEq, thiserror::Error)]
8pub enum StdError {
9 #[error(transparent)]
11 Api(#[from] ApiError),
12 #[error(transparent)]
14 Io(#[from] IoError),
15 #[error("address resolution yielded no socket addresses")]
17 NoResolvedAddress,
18 #[error("invalid socket address")]
20 InvalidSocketAddress,
21 #[error("invalid socket port")]
23 InvalidSocketPort,
24 #[error("no destination address was provided")]
26 MissingDestinationAddress,
27 #[error("recursive directory creation is not supported")]
29 RecursiveDirectoryCreationUnsupported,
30 #[error("thread exited without publishing its result")]
32 ThreadResultUnavailable,
33 #[error("the runtime reported no available CPUs")]
35 NoAvailableCpu,
36}
37
38pub 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}