Files
wazero/internal/gojs/errno.go
2023-07-17 08:13:29 +08:00

113 lines
2.7 KiB
Go

package gojs
import (
"io"
"github.com/tetratelabs/wazero/experimental/sys"
)
// Errno is a (GOARCH=wasm) error, which must match a key in mapJSError.
//
// See https://github.com/golang/go/blob/go1.20/src/syscall/tables_js.go#L371-L494
type Errno struct {
s string
}
// Error implements error.
func (e *Errno) Error() string {
return e.s
}
// This order match constants from wasi_snapshot_preview1.ErrnoSuccess for
// easier maintenance.
var (
// ErrnoAcces Permission denied.
ErrnoAcces = &Errno{"EACCES"}
// ErrnoAgain Resource unavailable, or operation would block.
ErrnoAgain = &Errno{"EAGAIN"}
// ErrnoBadf Bad file descriptor.
ErrnoBadf = &Errno{"EBADF"}
// ErrnoExist File exists.
ErrnoExist = &Errno{"EEXIST"}
// ErrnoFault Bad address.
ErrnoFault = &Errno{"EFAULT"}
// ErrnoIntr Interrupted function.
ErrnoIntr = &Errno{"EINTR"}
// ErrnoInval Invalid argument.
ErrnoInval = &Errno{"EINVAL"}
// ErrnoIo I/O error.
ErrnoIo = &Errno{"EIO"}
// ErrnoIsdir Is a directory.
ErrnoIsdir = &Errno{"EISDIR"}
// ErrnoLoop Too many levels of symbolic links.
ErrnoLoop = &Errno{"ELOOP"}
// ErrnoNametoolong Filename too long.
ErrnoNametoolong = &Errno{"ENAMETOOLONG"}
// ErrnoNoent No such file or directory.
ErrnoNoent = &Errno{"ENOENT"}
// ErrnoNosys function not supported.
ErrnoNosys = &Errno{"ENOSYS"}
// ErrnoNotdir Not a directory or a symbolic link to a directory.
ErrnoNotdir = &Errno{"ENOTDIR"}
// ErrnoNotempty Directory not empty.
ErrnoNotempty = &Errno{"ENOTEMPTY"}
// ErrnoNotsup Not supported, or operation not supported on socket.
ErrnoNotsup = &Errno{"ENOTSUP"}
// ErrnoPerm Operation not permitted.
ErrnoPerm = &Errno{"EPERM"}
// ErrnoRofs read-only file system.
ErrnoRofs = &Errno{"EROFS"}
)
// ToErrno maps I/O errors as the message must be the code, ex. "EINVAL", not
// the message, e.g. "invalid argument".
func ToErrno(err error) *Errno {
if err == nil || err == io.EOF {
return nil // io.EOF has no value in GOOS=js, and isn't an error.
}
errno, ok := err.(sys.Errno)
if !ok {
return ErrnoIo
}
switch errno {
case sys.EACCES:
return ErrnoAcces
case sys.EAGAIN:
return ErrnoAgain
case sys.EBADF:
return ErrnoBadf
case sys.EEXIST:
return ErrnoExist
case sys.EFAULT:
return ErrnoFault
case sys.EINTR:
return ErrnoIntr
case sys.EINVAL:
return ErrnoInval
case sys.EIO:
return ErrnoIo
case sys.EISDIR:
return ErrnoIsdir
case sys.ELOOP:
return ErrnoLoop
case sys.ENAMETOOLONG:
return ErrnoNametoolong
case sys.ENOENT:
return ErrnoNoent
case sys.ENOSYS:
return ErrnoNosys
case sys.ENOTDIR:
return ErrnoNotdir
case sys.ENOTEMPTY:
return ErrnoNotempty
case sys.ENOTSUP:
return ErrnoNotsup
case sys.EPERM:
return ErrnoPerm
case sys.EROFS:
return ErrnoRofs
default:
return ErrnoIo
}
}