internal/vfs/error.go (67 lines of code) (raw):
// Licensed to Elasticsearch B.V. under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
// ownership. Elasticsearch B.V. licenses this file to you under
// the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package vfs
import (
"github.com/elastic/go-txfile/internal/strbld"
)
// Error is the common error type used by vfs implementations.
type Error struct {
op string
kind error
path string
err error
}
// Kind encodes an error code for use by applications.
// Implementations of vfs must unify errors, using the Error type and the error
// codes defined here.
type Kind int
//go:generate stringer -type=Kind -linecomment=true
//go:generate beatsfmt -w kind_string.go
const (
ErrOSOther Kind = iota // unknown OS error
ErrPermission // permission denied
ErrExist // file already exists
ErrNotExist // file does not exist
ErrClosed // file already closed
ErrNoSpace // no space or quota exhausted
ErrFDLimit // process file desciptor limit reached
ErrResolvePath // cannot resolve path
ErrIO // read/write IO error
ErrNotSupported // operation not supported
ErrLockFailed // file lock failed
ErrUnlockFailed // file unlock failed
endOfErrKind // unknown error kind
)
// Error returns the error codes descriptive text.
func (k Kind) Error() string {
if k < endOfErrKind {
return k.String()
}
return "unknown"
}
// Err creates a new Error. All fields are optional.
func Err(op string, kind Kind, path string, err error) *Error {
return &Error{op: op, kind: kind, path: path, err: err}
}
// Op reports the failed operation.
func (e *Error) Op() string { return e.op }
// Kind returns the error code for use by the applications error handling code.
func (e *Error) Kind() error { return e.kind }
// Path returns the path of the file an operation failed for.
func (e *Error) Path() string { return e.path }
// Cause returns the causing error, is there is one. Returns nil if the error
// is the root cause of an error.
func (e *Error) Cause() error { return e.err }
// Errors returns the error cause as a list. The Errors method is avaialble for
// compatiblity with other error packages and libraries consuming errors (e.g. zap or multierr).
func (e *Error) Errors() []error {
if e.err == nil {
return nil
}
return []error{e.err}
}
// Error builds the error message of the underlying error.
func (e *Error) Error() string {
buf := &strbld.Builder{}
putStr(buf, e.op)
putStr(buf, e.path)
putErr(buf, e.kind)
putErr(buf, e.err)
if buf.Len() == 0 {
return "no error"
}
return buf.String()
}
func putStr(b *strbld.Builder, s string) {
if s != "" {
b.Pad(": ")
b.WriteString(s)
}
}
func putErr(b *strbld.Builder, err error) {
if err != nil {
putStr(b, err.Error())
}
}