blob: 8bd17c8b562ff98a03ff6665af5ca0de78f69193 [file] [log] [blame]
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package oserror defines errors values used in the os package.
//
// These types are defined here to permit the syscall package to reference them.
package oserror
import "errors"
var (
ErrInvalid = errors.New("invalid argument")
ErrPermission = errors.New("permission denied")
ErrExist = errors.New("file already exists")
ErrNotExist = errors.New("file does not exist")
ErrClosed = errors.New("file already closed")
ErrTemporary = temporaryError{}
ErrTimeout = timeoutError{}
)
type timeoutError struct{}
func (timeoutError) Error() string { return "deadline exceeded" }
func (timeoutError) Timeout() bool { return true }
type temporaryError struct{}
func (temporaryError) Error() string { return "temporary error" }
func (temporaryError) Temporary() bool { return true }
// IsTimeout reports whether err indicates a timeout.
func IsTimeout(err error) bool {
for err != nil {
if err == ErrTimeout {
return true
}
if x, ok := err.(interface{ Timeout() bool }); ok {
return x.Timeout()
}
if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(ErrTimeout) {
return true
}
err = errors.Unwrap(err)
}
return false
}
// IsTemporary reports whether err indicates a temporary condition.
func IsTemporary(err error) bool {
for err != nil {
if err == ErrTemporary {
return true
}
if x, ok := err.(interface{ Temporary() bool }); ok {
return x.Temporary()
}
if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(ErrTemporary) {
return true
}
err = errors.Unwrap(err)
}
return false
}