libuv: Errno, build up errors at comptime

This commit is contained in:
Mitchell Hashimoto
2022-04-25 19:20:54 -07:00
parent 0258b24d1f
commit 4bb2808d73

View File

@ -2,179 +2,190 @@ const std = @import("std");
const testing = std.testing; const testing = std.testing;
const c = @import("c.zig"); const c = @import("c.zig");
/// Errors that libuv can produce /// Enum mapping for errors.
pub const Errno = enum(i32) {
E2BIG = c.UV_E2BIG,
EACCES = c.UV_EACCES,
EADDRINUSE = c.UV_EADDRINUSE,
EADDRNOTAVAIL = c.UV_EADDRNOTAVAIL,
EAFNOSUPPORT = c.UV_EAFNOSUPPORT,
EAGAIN = c.UV_EAGAIN,
EAI_ADDRFAMILY = c.UV_EAI_ADDRFAMILY,
EAI_AGAIN = c.UV_EAI_AGAIN,
EAI_BADFLAGS = c.UV_EAI_BADFLAGS,
EAI_BADHINTS = c.UV_EAI_BADHINTS,
EAI_CANCELED = c.UV_EAI_CANCELED,
EAI_FAIL = c.UV_EAI_FAIL,
EAI_FAMILY = c.UV_EAI_FAMILY,
EAI_MEMORY = c.UV_EAI_MEMORY,
EAI_NODATA = c.UV_EAI_NODATA,
EAI_NONAME = c.UV_EAI_NONAME,
EAI_OVERFLOW = c.UV_EAI_OVERFLOW,
EAI_PROTOCOL = c.UV_EAI_PROTOCOL,
EAI_SERVICE = c.UV_EAI_SERVICE,
EAI_SOCKTYPE = c.UV_EAI_SOCKTYPE,
EALREADY = c.UV_EALREADY,
EBADF = c.UV_EBADF,
EBUSY = c.UV_EBUSY,
ECANCELED = c.UV_ECANCELED,
ECHARSET = c.UV_ECHARSET,
ECONNABORTED = c.UV_ECONNABORTED,
ECONNREFUSED = c.UV_ECONNREFUSED,
ECONNRESET = c.UV_ECONNRESET,
EDESTADDRREQ = c.UV_EDESTADDRREQ,
EEXIST = c.UV_EEXIST,
EFAULT = c.UV_EFAULT,
EFBIG = c.UV_EFBIG,
EHOSTUNREACH = c.UV_EHOSTUNREACH,
EINTR = c.UV_EINTR,
EINVAL = c.UV_EINVAL,
EIO = c.UV_EIO,
EISCONN = c.UV_EISCONN,
EISDIR = c.UV_EISDIR,
ELOOP = c.UV_ELOOP,
EMFILE = c.UV_EMFILE,
EMSGSIZE = c.UV_EMSGSIZE,
ENAMETOOLONG = c.UV_ENAMETOOLONG,
ENETDOWN = c.UV_ENETDOWN,
ENETUNREACH = c.UV_ENETUNREACH,
ENFILE = c.UV_ENFILE,
ENOBUFS = c.UV_ENOBUFS,
ENODEV = c.UV_ENODEV,
ENOENT = c.UV_ENOENT,
ENOMEM = c.UV_ENOMEM,
ENONET = c.UV_ENONET,
ENOPROTOOPT = c.UV_ENOPROTOOPT,
ENOSPC = c.UV_ENOSPC,
ENOSYS = c.UV_ENOSYS,
ENOTCONN = c.UV_ENOTCONN,
ENOTDIR = c.UV_ENOTDIR,
ENOTEMPTY = c.UV_ENOTEMPTY,
ENOTSOCK = c.UV_ENOTSOCK,
ENOTSUP = c.UV_ENOTSUP,
EPERM = c.UV_EPERM,
EPIPE = c.UV_EPIPE,
EPROTO = c.UV_EPROTO,
EPROTONOSUPPORT = c.UV_EPROTONOSUPPORT,
EPROTOTYPE = c.UV_EPROTOTYPE,
ERANGE = c.UV_ERANGE,
EROFS = c.UV_EROFS,
ESHUTDOWN = c.UV_ESHUTDOWN,
ESPIPE = c.UV_ESPIPE,
ESRCH = c.UV_ESRCH,
ETIMEDOUT = c.UV_ETIMEDOUT,
ETXTBSY = c.UV_ETXTBSY,
EXDEV = c.UV_EXDEV,
UNKNOWN = c.UV_UNKNOWN,
EOF = c.UV_EOF,
ENXIO = c.UV_ENXIO,
EHOSTDOWN = c.UV_EHOSTDOWN,
EREMOTEIO = c.UV_EREMOTEIO,
ENOTTY = c.UV_ENOTTY,
EFTYPE = c.UV_EFTYPE,
EILSEQ = c.UV_EILSEQ,
ESOCKTNOSUPPORT = c.UV_ESOCKTNOSUPPORT,
};
/// Errors that libuv can produce.
/// ///
/// http://docs.libuv.org/en/v1.x/errors.html /// http://docs.libuv.org/en/v1.x/errors.html
pub const Error = error{ pub const Error = blk: {
E2BIG, // We produce these from the Errno enum so that we can easily
EACCES, // keep it synced.
EADDRINUSE, const info = @typeInfo(Errno).Enum;
EADDRNOTAVAIL, var errors: [info.fields.len]std.builtin.Type.Error = undefined;
EAFNOSUPPORT, for (info.fields) |field, i| {
EAGAIN, errors[i] = .{ .name = field.name };
EAI_ADDRFAMILY, }
EAI_AGAIN,
EAI_BADFLAGS, break :blk @Type(.{ .ErrorSet = &errors });
EAI_BADHINTS,
EAI_CANCELED,
EAI_FAIL,
EAI_FAMILY,
EAI_MEMORY,
EAI_NODATA,
EAI_NONAME,
EAI_OVERFLOW,
EAI_PROTOCOL,
EAI_SERVICE,
EAI_SOCKTYPE,
EALREADY,
EBADF,
EBUSY,
ECANCELED,
ECHARSET,
ECONNABORTED,
ECONNREFUSED,
ECONNRESET,
EDESTADDRREQ,
EEXIST,
EFAULT,
EFBIG,
EHOSTUNREACH,
EINTR,
EINVAL,
EIO,
EISCONN,
EISDIR,
ELOOP,
EMFILE,
EMSGSIZE,
ENAMETOOLONG,
ENETDOWN,
ENETUNREACH,
ENFILE,
ENOBUFS,
ENODEV,
ENOENT,
ENOMEM,
ENONET,
ENOPROTOOPT,
ENOSPC,
ENOSYS,
ENOTCONN,
ENOTDIR,
ENOTEMPTY,
ENOTSOCK,
ENOTSUP,
EPERM,
EPIPE,
EPROTO,
EPROTONOSUPPORT,
EPROTOTYPE,
ERANGE,
EROFS,
ESHUTDOWN,
ESPIPE,
ESRCH,
ETIMEDOUT,
ETXTBSY,
EXDEV,
UNKNOWN,
EOF,
ENXIO,
EMLINK,
EHOSTDOWN,
EREMOTEIO,
ENOTTY,
EFTYPE,
EILSEQ,
ESOCKTNOSUPPORT,
}; };
/// Convert the result of a libuv API call to an error (or no error). /// Convert the result of a libuv API call to an error (or no error).
pub fn convertError(r: i32) !void { pub fn convertError(r: i32) !void {
if (r >= 0) return; if (r >= 0) return;
return switch (r) { return switch (@intToEnum(Errno, r)) {
c.UV_E2BIG => Error.E2BIG, .E2BIG => Error.E2BIG,
c.UV_EACCES => Error.EACCES, .EACCES => Error.EACCES,
c.UV_EADDRINUSE => Error.EADDRINUSE, .EADDRINUSE => Error.EADDRINUSE,
c.UV_EADDRNOTAVAIL => Error.EADDRNOTAVAIL, .EADDRNOTAVAIL => Error.EADDRNOTAVAIL,
c.UV_EAFNOSUPPORT => Error.EAFNOSUPPORT, .EAFNOSUPPORT => Error.EAFNOSUPPORT,
c.UV_EAGAIN => Error.EAGAIN, .EAGAIN => Error.EAGAIN,
c.UV_EAI_ADDRFAMILY => Error.EAI_ADDRFAMILY, .EAI_ADDRFAMILY => Error.EAI_ADDRFAMILY,
c.UV_EAI_AGAIN => Error.EAI_AGAIN, .EAI_AGAIN => Error.EAI_AGAIN,
c.UV_EAI_BADFLAGS => Error.EAI_BADFLAGS, .EAI_BADFLAGS => Error.EAI_BADFLAGS,
c.UV_EAI_BADHINTS => Error.EAI_BADHINTS, .EAI_BADHINTS => Error.EAI_BADHINTS,
c.UV_EAI_CANCELED => Error.EAI_CANCELED, .EAI_CANCELED => Error.EAI_CANCELED,
c.UV_EAI_FAIL => Error.EAI_FAIL, .EAI_FAIL => Error.EAI_FAIL,
c.UV_EAI_FAMILY => Error.EAI_FAMILY, .EAI_FAMILY => Error.EAI_FAMILY,
c.UV_EAI_MEMORY => Error.EAI_MEMORY, .EAI_MEMORY => Error.EAI_MEMORY,
c.UV_EAI_NODATA => Error.EAI_NODATA, .EAI_NODATA => Error.EAI_NODATA,
c.UV_EAI_NONAME => Error.EAI_NONAME, .EAI_NONAME => Error.EAI_NONAME,
c.UV_EAI_OVERFLOW => Error.EAI_OVERFLOW, .EAI_OVERFLOW => Error.EAI_OVERFLOW,
c.UV_EAI_PROTOCOL => Error.EAI_PROTOCOL, .EAI_PROTOCOL => Error.EAI_PROTOCOL,
c.UV_EAI_SERVICE => Error.EAI_SERVICE, .EAI_SERVICE => Error.EAI_SERVICE,
c.UV_EAI_SOCKTYPE => Error.EAI_SOCKTYPE, .EAI_SOCKTYPE => Error.EAI_SOCKTYPE,
c.UV_EALREADY => Error.EALREADY, .EALREADY => Error.EALREADY,
c.UV_EBADF => Error.EBADF, .EBADF => Error.EBADF,
c.UV_EBUSY => Error.EBUSY, .EBUSY => Error.EBUSY,
c.UV_ECANCELED => Error.ECANCELED, .ECANCELED => Error.ECANCELED,
c.UV_ECHARSET => Error.ECHARSET, .ECHARSET => Error.ECHARSET,
c.UV_ECONNABORTED => Error.ECONNABORTED, .ECONNABORTED => Error.ECONNABORTED,
c.UV_ECONNREFUSED => Error.ECONNREFUSED, .ECONNREFUSED => Error.ECONNREFUSED,
c.UV_ECONNRESET => Error.ECONNRESET, .ECONNRESET => Error.ECONNRESET,
c.UV_EDESTADDRREQ => Error.EDESTADDRREQ, .EDESTADDRREQ => Error.EDESTADDRREQ,
c.UV_EEXIST => Error.EEXIST, .EEXIST => Error.EEXIST,
c.UV_EFAULT => Error.EFAULT, .EFAULT => Error.EFAULT,
c.UV_EFBIG => Error.EFBIG, .EFBIG => Error.EFBIG,
c.UV_EHOSTUNREACH => Error.EHOSTUNREACH, .EHOSTUNREACH => Error.EHOSTUNREACH,
c.UV_EINTR => Error.EINTR, .EINTR => Error.EINTR,
c.UV_EINVAL => Error.EINVAL, .EINVAL => Error.EINVAL,
c.UV_EIO => Error.EIO, .EIO => Error.EIO,
c.UV_EISCONN => Error.EISCONN, .EISCONN => Error.EISCONN,
c.UV_EISDIR => Error.EISDIR, .EISDIR => Error.EISDIR,
c.UV_ELOOP => Error.ELOOP, .ELOOP => Error.ELOOP,
c.UV_EMFILE => Error.EMFILE, .EMFILE => Error.EMFILE,
c.UV_EMSGSIZE => Error.EMSGSIZE, .EMSGSIZE => Error.EMSGSIZE,
c.UV_ENAMETOOLONG => Error.ENAMETOOLONG, .ENAMETOOLONG => Error.ENAMETOOLONG,
c.UV_ENETDOWN => Error.ENETDOWN, .ENETDOWN => Error.ENETDOWN,
c.UV_ENETUNREACH => Error.ENETUNREACH, .ENETUNREACH => Error.ENETUNREACH,
c.UV_ENFILE => Error.ENFILE, .ENFILE => Error.ENFILE,
c.UV_ENOBUFS => Error.ENOBUFS, .ENOBUFS => Error.ENOBUFS,
c.UV_ENODEV => Error.ENODEV, .ENODEV => Error.ENODEV,
c.UV_ENOENT => Error.ENOENT, .ENOENT => Error.ENOENT,
c.UV_ENOMEM => Error.ENOMEM, .ENOMEM => Error.ENOMEM,
c.UV_ENONET => Error.ENONET, .ENONET => Error.ENONET,
c.UV_ENOPROTOOPT => Error.ENOPROTOOPT, .ENOPROTOOPT => Error.ENOPROTOOPT,
c.UV_ENOSPC => Error.ENOSPC, .ENOSPC => Error.ENOSPC,
c.UV_ENOSYS => Error.ENOSYS, .ENOSYS => Error.ENOSYS,
c.UV_ENOTCONN => Error.ENOTCONN, .ENOTCONN => Error.ENOTCONN,
c.UV_ENOTDIR => Error.ENOTDIR, .ENOTDIR => Error.ENOTDIR,
c.UV_ENOTEMPTY => Error.ENOTEMPTY, .ENOTEMPTY => Error.ENOTEMPTY,
c.UV_ENOTSOCK => Error.ENOTSOCK, .ENOTSOCK => Error.ENOTSOCK,
c.UV_ENOTSUP => Error.ENOTSUP, .ENOTSUP => Error.ENOTSUP,
c.UV_EPERM => Error.EPERM, .EPERM => Error.EPERM,
c.UV_EPIPE => Error.EPIPE, .EPIPE => Error.EPIPE,
c.UV_EPROTO => Error.EPROTO, .EPROTO => Error.EPROTO,
c.UV_EPROTONOSUPPORT => Error.EPROTONOSUPPORT, .EPROTONOSUPPORT => Error.EPROTONOSUPPORT,
c.UV_EPROTOTYPE => Error.EPROTOTYPE, .EPROTOTYPE => Error.EPROTOTYPE,
c.UV_ERANGE => Error.ERANGE, .ERANGE => Error.ERANGE,
c.UV_EROFS => Error.EROFS, .EROFS => Error.EROFS,
c.UV_ESHUTDOWN => Error.ESHUTDOWN, .ESHUTDOWN => Error.ESHUTDOWN,
c.UV_ESPIPE => Error.ESPIPE, .ESPIPE => Error.ESPIPE,
c.UV_ESRCH => Error.ESRCH, .ESRCH => Error.ESRCH,
c.UV_ETIMEDOUT => Error.ETIMEDOUT, .ETIMEDOUT => Error.ETIMEDOUT,
c.UV_ETXTBSY => Error.ETXTBSY, .ETXTBSY => Error.ETXTBSY,
c.UV_EXDEV => Error.EXDEV, .EXDEV => Error.EXDEV,
c.UV_UNKNOWN => Error.UNKNOWN, .UNKNOWN => Error.UNKNOWN,
c.UV_EOF => Error.EOF, .EOF => Error.EOF,
c.UV_ENXIO => Error.ENXIO, .ENXIO => Error.ENXIO,
c.UV_EHOSTDOWN => Error.EHOSTDOWN, .EHOSTDOWN => Error.EHOSTDOWN,
c.UV_EREMOTEIO => Error.EREMOTEIO, .EREMOTEIO => Error.EREMOTEIO,
c.UV_ENOTTY => Error.ENOTTY, .ENOTTY => Error.ENOTTY,
c.UV_EFTYPE => Error.EFTYPE, .EFTYPE => Error.EFTYPE,
c.UV_EILSEQ => Error.EILSEQ, .EILSEQ => Error.EILSEQ,
c.UV_ESOCKTNOSUPPORT => Error.ESOCKTNOSUPPORT, .ESOCKTNOSUPPORT => Error.ESOCKTNOSUPPORT,
else => unreachable,
}; };
} }