92 lines
2.8 KiB
Go
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
|
|
}
|