async_wasi/snapshots/common/
error.rs

1use std::{fmt::Debug, io::ErrorKind};
2
3pub use super::types::__wasi_errno_t as wasi_errno;
4
5#[derive(Debug, Eq, PartialEq, Clone, Copy)]
6pub struct Errno(pub wasi_errno::Type);
7
8impl Default for Errno {
9    fn default() -> Self {
10        Errno::__WASI_ERRNO_SUCCESS
11    }
12}
13
14impl Errno {
15    pub const __WASI_ERRNO_SUCCESS: Errno = Errno(0);
16    pub const __WASI_ERRNO_2BIG: Errno = Errno(1);
17    pub const __WASI_ERRNO_ACCES: Errno = Errno(2);
18    pub const __WASI_ERRNO_ADDRINUSE: Errno = Errno(3);
19    pub const __WASI_ERRNO_ADDRNOTAVAIL: Errno = Errno(4);
20    pub const __WASI_ERRNO_AFNOSUPPORT: Errno = Errno(5);
21    pub const __WASI_ERRNO_AGAIN: Errno = Errno(6);
22    pub const __WASI_ERRNO_ALREADY: Errno = Errno(7);
23    pub const __WASI_ERRNO_BADF: Errno = Errno(8);
24    pub const __WASI_ERRNO_BADMSG: Errno = Errno(9);
25    pub const __WASI_ERRNO_BUSY: Errno = Errno(10);
26    pub const __WASI_ERRNO_CANCELED: Errno = Errno(11);
27    pub const __WASI_ERRNO_CHILD: Errno = Errno(12);
28    pub const __WASI_ERRNO_CONNABORTED: Errno = Errno(13);
29    pub const __WASI_ERRNO_CONNREFUSED: Errno = Errno(14);
30    pub const __WASI_ERRNO_CONNRESET: Errno = Errno(15);
31    pub const __WASI_ERRNO_DEADLK: Errno = Errno(16);
32    pub const __WASI_ERRNO_DESTADDRREQ: Errno = Errno(17);
33    pub const __WASI_ERRNO_DOM: Errno = Errno(18);
34    pub const __WASI_ERRNO_DQUOT: Errno = Errno(19);
35    pub const __WASI_ERRNO_EXIST: Errno = Errno(20);
36    pub const __WASI_ERRNO_FAULT: Errno = Errno(21);
37    pub const __WASI_ERRNO_FBIG: Errno = Errno(22);
38    pub const __WASI_ERRNO_HOSTUNREACH: Errno = Errno(23);
39    pub const __WASI_ERRNO_IDRM: Errno = Errno(24);
40    pub const __WASI_ERRNO_ILSEQ: Errno = Errno(25);
41    pub const __WASI_ERRNO_INPROGRESS: Errno = Errno(26);
42    pub const __WASI_ERRNO_INTR: Errno = Errno(27);
43    pub const __WASI_ERRNO_INVAL: Errno = Errno(28);
44    pub const __WASI_ERRNO_IO: Errno = Errno(29);
45    pub const __WASI_ERRNO_ISCONN: Errno = Errno(30);
46    pub const __WASI_ERRNO_ISDIR: Errno = Errno(31);
47    pub const __WASI_ERRNO_LOOP: Errno = Errno(32);
48    pub const __WASI_ERRNO_MFILE: Errno = Errno(33);
49    pub const __WASI_ERRNO_MLINK: Errno = Errno(34);
50    pub const __WASI_ERRNO_MSGSIZE: Errno = Errno(35);
51    pub const __WASI_ERRNO_MULTIHOP: Errno = Errno(36);
52    pub const __WASI_ERRNO_NAMETOOLONG: Errno = Errno(37);
53    pub const __WASI_ERRNO_NETDOWN: Errno = Errno(38);
54    pub const __WASI_ERRNO_NETRESET: Errno = Errno(39);
55    pub const __WASI_ERRNO_NETUNREACH: Errno = Errno(40);
56    pub const __WASI_ERRNO_NFILE: Errno = Errno(41);
57    pub const __WASI_ERRNO_NOBUFS: Errno = Errno(42);
58    pub const __WASI_ERRNO_NODEV: Errno = Errno(43);
59    pub const __WASI_ERRNO_NOENT: Errno = Errno(44);
60    pub const __WASI_ERRNO_NOEXEC: Errno = Errno(45);
61    pub const __WASI_ERRNO_NOLCK: Errno = Errno(46);
62    pub const __WASI_ERRNO_NOLINK: Errno = Errno(47);
63    pub const __WASI_ERRNO_NOMEM: Errno = Errno(48);
64    pub const __WASI_ERRNO_NOMSG: Errno = Errno(49);
65    pub const __WASI_ERRNO_NOPROTOOPT: Errno = Errno(50);
66    pub const __WASI_ERRNO_NOSPC: Errno = Errno(51);
67    pub const __WASI_ERRNO_NOSYS: Errno = Errno(52);
68    pub const __WASI_ERRNO_NOTCONN: Errno = Errno(53);
69    pub const __WASI_ERRNO_NOTDIR: Errno = Errno(54);
70    pub const __WASI_ERRNO_NOTEMPTY: Errno = Errno(55);
71    pub const __WASI_ERRNO_NOTRECOVERABLE: Errno = Errno(56);
72    pub const __WASI_ERRNO_NOTSOCK: Errno = Errno(57);
73    pub const __WASI_ERRNO_NOTSUP: Errno = Errno(58);
74    pub const __WASI_ERRNO_NOTTY: Errno = Errno(59);
75    pub const __WASI_ERRNO_NXIO: Errno = Errno(60);
76    pub const __WASI_ERRNO_OVERFLOW: Errno = Errno(61);
77    pub const __WASI_ERRNO_OWNERDEAD: Errno = Errno(62);
78    pub const __WASI_ERRNO_PERM: Errno = Errno(63);
79    pub const __WASI_ERRNO_PIPE: Errno = Errno(64);
80    pub const __WASI_ERRNO_PROTO: Errno = Errno(65);
81    pub const __WASI_ERRNO_PROTONOSUPPORT: Errno = Errno(66);
82    pub const __WASI_ERRNO_PROTOTYPE: Errno = Errno(67);
83    pub const __WASI_ERRNO_RANGE: Errno = Errno(68);
84    pub const __WASI_ERRNO_ROFS: Errno = Errno(69);
85    pub const __WASI_ERRNO_SPIPE: Errno = Errno(70);
86    pub const __WASI_ERRNO_SRCH: Errno = Errno(71);
87    pub const __WASI_ERRNO_STALE: Errno = Errno(72);
88    pub const __WASI_ERRNO_TIMEDOUT: Errno = Errno(73);
89    pub const __WASI_ERRNO_TXTBSY: Errno = Errno(74);
90    pub const __WASI_ERRNO_XDEV: Errno = Errno(75);
91    pub const __WASI_ERRNO_NOTCAPABLE: Errno = Errno(76);
92    pub const __WASI_ERRNO_AIADDRFAMILY: Errno = Errno(77);
93    pub const __WASI_ERRNO_AIAGAIN: Errno = Errno(78);
94    pub const __WASI_ERRNO_AIBADFLAG: Errno = Errno(79);
95    pub const __WASI_ERRNO_AIFAIL: Errno = Errno(80);
96    pub const __WASI_ERRNO_AIFAMILY: Errno = Errno(81);
97    pub const __WASI_ERRNO_AIMEMORY: Errno = Errno(82);
98    pub const __WASI_ERRNO_AINODATA: Errno = Errno(83);
99    pub const __WASI_ERRNO_AINONAME: Errno = Errno(84);
100    pub const __WASI_ERRNO_AISERVICE: Errno = Errno(85);
101    pub const __WASI_ERRNO_AISOCKTYPE: Errno = Errno(86);
102    pub const __WASI_ERRNO_AISYSTEM: Errno = Errno(87);
103}
104
105impl From<wasi_errno::Type> for Errno {
106    fn from(e: wasi_errno::Type) -> Self {
107        Errno(e)
108    }
109}
110
111impl From<ErrorKind> for Errno {
112    fn from(e: ErrorKind) -> Self {
113        match e {
114            ErrorKind::NotFound => Errno::__WASI_ERRNO_NOENT,
115            ErrorKind::PermissionDenied => Errno::__WASI_ERRNO_PERM,
116            ErrorKind::ConnectionRefused => Errno::__WASI_ERRNO_CONNREFUSED,
117            ErrorKind::ConnectionReset => Errno::__WASI_ERRNO_CONNRESET,
118            ErrorKind::ConnectionAborted => Errno::__WASI_ERRNO_CONNABORTED,
119            ErrorKind::NotConnected => Errno::__WASI_ERRNO_NOTCONN,
120            ErrorKind::AddrInUse => Errno::__WASI_ERRNO_ADDRINUSE,
121            ErrorKind::AddrNotAvailable => Errno::__WASI_ERRNO_ADDRNOTAVAIL,
122            ErrorKind::BrokenPipe => Errno::__WASI_ERRNO_PIPE,
123            ErrorKind::AlreadyExists => Errno::__WASI_ERRNO_EXIST,
124            ErrorKind::WouldBlock => Errno::__WASI_ERRNO_AGAIN,
125            ErrorKind::InvalidInput => Errno::__WASI_ERRNO_INVAL,
126            ErrorKind::InvalidData => Errno::__WASI_ERRNO_IO,
127            ErrorKind::TimedOut => Errno::__WASI_ERRNO_TIMEDOUT,
128            ErrorKind::WriteZero => Errno::__WASI_ERRNO_IO,
129            ErrorKind::Interrupted => Errno::__WASI_ERRNO_INTR,
130            ErrorKind::UnexpectedEof => Errno::__WASI_ERRNO_IO,
131            ErrorKind::Unsupported => Errno::__WASI_ERRNO_NOTSUP,
132            ErrorKind::OutOfMemory => Errno::__WASI_ERRNO_NOMEM,
133            _ => Errno::__WASI_ERRNO_IO,
134        }
135    }
136}
137
138impl From<&std::io::Error> for Errno {
139    fn from(e: &std::io::Error) -> Self {
140        if let Some(error_code) = e.raw_os_error() {
141            match error_code {
142                0 => Errno::__WASI_ERRNO_SUCCESS,
143                libc::E2BIG => Errno::__WASI_ERRNO_2BIG,
144                libc::EACCES => Errno::__WASI_ERRNO_ACCES,
145                libc::EADDRINUSE => Errno::__WASI_ERRNO_ADDRINUSE,
146                libc::EADDRNOTAVAIL => Errno::__WASI_ERRNO_ADDRNOTAVAIL,
147                libc::EAFNOSUPPORT => Errno::__WASI_ERRNO_AFNOSUPPORT,
148                libc::EAGAIN => Errno::__WASI_ERRNO_AGAIN,
149                libc::EALREADY => Errno::__WASI_ERRNO_ALREADY,
150                libc::EBADF => Errno::__WASI_ERRNO_BADF,
151                libc::EBADMSG => Errno::__WASI_ERRNO_BADMSG,
152                libc::EBUSY => Errno::__WASI_ERRNO_BUSY,
153                libc::ECANCELED => Errno::__WASI_ERRNO_CANCELED,
154                libc::ECHILD => Errno::__WASI_ERRNO_CHILD,
155                libc::ECONNABORTED => Errno::__WASI_ERRNO_CONNABORTED,
156                libc::ECONNREFUSED => Errno::__WASI_ERRNO_CONNREFUSED,
157                libc::ECONNRESET => Errno::__WASI_ERRNO_CONNRESET,
158                libc::EDEADLK => Errno::__WASI_ERRNO_DEADLK,
159                libc::EDESTADDRREQ => Errno::__WASI_ERRNO_DESTADDRREQ,
160                libc::EDOM => Errno::__WASI_ERRNO_DOM,
161                #[cfg(unix)]
162                libc::EDQUOT => Errno::__WASI_ERRNO_DQUOT,
163                libc::EEXIST => Errno::__WASI_ERRNO_EXIST,
164                libc::EFAULT => Errno::__WASI_ERRNO_FAULT,
165                libc::EFBIG => Errno::__WASI_ERRNO_FBIG,
166                libc::EHOSTUNREACH => Errno::__WASI_ERRNO_HOSTUNREACH,
167                libc::EIDRM => Errno::__WASI_ERRNO_IDRM,
168                libc::EILSEQ => Errno::__WASI_ERRNO_ILSEQ,
169                libc::EINPROGRESS => Errno::__WASI_ERRNO_INPROGRESS,
170                libc::EINTR => Errno::__WASI_ERRNO_INTR,
171                libc::EINVAL => Errno::__WASI_ERRNO_INVAL,
172                libc::EIO => Errno::__WASI_ERRNO_IO,
173                libc::EISCONN => Errno::__WASI_ERRNO_ISCONN,
174                libc::EISDIR => Errno::__WASI_ERRNO_ISDIR,
175                libc::ELOOP => Errno::__WASI_ERRNO_LOOP,
176                libc::EMFILE => Errno::__WASI_ERRNO_MFILE,
177                libc::EMLINK => Errno::__WASI_ERRNO_MLINK,
178                libc::EMSGSIZE => Errno::__WASI_ERRNO_MSGSIZE,
179                #[cfg(unix)]
180                libc::EMULTIHOP => Errno::__WASI_ERRNO_MULTIHOP,
181                libc::ENAMETOOLONG => Errno::__WASI_ERRNO_NAMETOOLONG,
182                libc::ENETDOWN => Errno::__WASI_ERRNO_NETDOWN,
183                libc::ENETRESET => Errno::__WASI_ERRNO_NETRESET,
184                libc::ENETUNREACH => Errno::__WASI_ERRNO_NETUNREACH,
185                libc::ENFILE => Errno::__WASI_ERRNO_NFILE,
186                libc::ENOBUFS => Errno::__WASI_ERRNO_NOBUFS,
187                libc::ENODEV => Errno::__WASI_ERRNO_NODEV,
188                libc::ENOENT => Errno::__WASI_ERRNO_NOENT,
189                libc::ENOEXEC => Errno::__WASI_ERRNO_NOEXEC,
190                libc::ENOLCK => Errno::__WASI_ERRNO_NOLCK,
191                libc::ENOLINK => Errno::__WASI_ERRNO_NOLINK,
192                libc::ENOMEM => Errno::__WASI_ERRNO_NOMEM,
193                libc::ENOMSG => Errno::__WASI_ERRNO_NOMSG,
194                libc::ENOPROTOOPT => Errno::__WASI_ERRNO_NOPROTOOPT,
195                libc::ENOSPC => Errno::__WASI_ERRNO_NOSPC,
196                libc::ENOSYS => Errno::__WASI_ERRNO_NOSYS,
197                libc::ENOTCONN => Errno::__WASI_ERRNO_NOTCONN,
198                libc::ENOTDIR => Errno::__WASI_ERRNO_NOTDIR,
199                libc::ENOTEMPTY => Errno::__WASI_ERRNO_NOTEMPTY,
200                libc::ENOTRECOVERABLE => Errno::__WASI_ERRNO_NOTRECOVERABLE,
201                libc::ENOTSOCK => Errno::__WASI_ERRNO_NOTSOCK,
202                libc::ENOTSUP => Errno::__WASI_ERRNO_NOTSUP,
203                libc::ENOTTY => Errno::__WASI_ERRNO_NOTTY,
204                libc::ENXIO => Errno::__WASI_ERRNO_NXIO,
205                libc::EOVERFLOW => Errno::__WASI_ERRNO_OVERFLOW,
206                libc::EOWNERDEAD => Errno::__WASI_ERRNO_OWNERDEAD,
207                libc::EPERM => Errno::__WASI_ERRNO_PERM,
208                libc::EPIPE => Errno::__WASI_ERRNO_PIPE,
209                libc::EPROTO => Errno::__WASI_ERRNO_PROTO,
210                libc::EPROTONOSUPPORT => Errno::__WASI_ERRNO_PROTONOSUPPORT,
211                libc::EPROTOTYPE => Errno::__WASI_ERRNO_PROTOTYPE,
212                libc::ERANGE => Errno::__WASI_ERRNO_RANGE,
213                libc::EROFS => Errno::__WASI_ERRNO_ROFS,
214                libc::ESPIPE => Errno::__WASI_ERRNO_SPIPE,
215                libc::ESRCH => Errno::__WASI_ERRNO_SRCH,
216                #[cfg(unix)]
217                libc::ESTALE => Errno::__WASI_ERRNO_STALE,
218                libc::ETIMEDOUT => Errno::__WASI_ERRNO_TIMEDOUT,
219                libc::ETXTBSY => Errno::__WASI_ERRNO_TXTBSY,
220                libc::EXDEV => Errno::__WASI_ERRNO_XDEV,
221                _ => Errno::__WASI_ERRNO_IO,
222            }
223        } else {
224            let kind = e.kind();
225            Errno::from(kind)
226        }
227    }
228}
229
230impl From<std::io::Error> for Errno {
231    fn from(e: std::io::Error) -> Self {
232        Errno::from(&e)
233    }
234}