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