| // 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 | |
| } |