workgroups/vendor/gocloud.dev/gcerrors/errors.go
Marvin Preuss 1d4ae27878
All checks were successful
continuous-integration/drone/push Build is passing
ci: drone yaml with reusable anchors
2021-09-24 17:34:17 +02:00

92 lines
2.8 KiB
Go

// Copyright 2019 The Go Cloud Development Kit Authors
//
// Licensed 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
//
// https://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 gcerrors provides support for getting error codes from
// errors returned by Go CDK APIs.
package gcerrors
import (
"context"
"gocloud.dev/internal/gcerr"
"golang.org/x/xerrors"
)
// An ErrorCode describes the error's category. Programs should act upon an error's
// code, not its message.
type ErrorCode = gcerr.ErrorCode
const (
// Returned by the Code function on a nil error. It is not a valid
// code for an error.
OK ErrorCode = gcerr.OK
// The error could not be categorized.
Unknown ErrorCode = gcerr.Unknown
// The resource was not found.
NotFound ErrorCode = gcerr.NotFound
// The resource exists, but it should not.
AlreadyExists ErrorCode = gcerr.AlreadyExists
// A value given to a Go CDK API is incorrect.
InvalidArgument ErrorCode = gcerr.InvalidArgument
// Something unexpected happened. Internal errors always indicate
// bugs in the Go CDK (or possibly the underlying service).
Internal ErrorCode = gcerr.Internal
// The feature is not implemented.
Unimplemented ErrorCode = gcerr.Unimplemented
// The system was in the wrong state.
FailedPrecondition ErrorCode = gcerr.FailedPrecondition
// The caller does not have permission to execute the specified operation.
PermissionDenied ErrorCode = gcerr.PermissionDenied
// Some resource has been exhausted, typically because a service resource limit
// has been reached.
ResourceExhausted ErrorCode = gcerr.ResourceExhausted
// The operation was canceled.
Canceled ErrorCode = gcerr.Canceled
// The operation timed out.
DeadlineExceeded ErrorCode = gcerr.DeadlineExceeded
)
// Code returns the ErrorCode of err if it, or some error it wraps, is an *Error.
// If err is context.Canceled or context.DeadlineExceeded, or wraps one of those errors,
// it returns the Canceled or DeadlineExceeded codes, respectively.
// If err is nil, it returns the special code OK.
// Otherwise, it returns Unknown.
func Code(err error) ErrorCode {
if err == nil {
return OK
}
var e *gcerr.Error
if xerrors.As(err, &e) {
return e.Code
}
if xerrors.Is(err, context.Canceled) {
return Canceled
}
if xerrors.Is(err, context.DeadlineExceeded) {
return DeadlineExceeded
}
return Unknown
}