-
Notifications
You must be signed in to change notification settings - Fork 0
/
error.go
93 lines (77 loc) · 2.63 KB
/
error.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// Copyright © 2023 Dell Inc. or its subsidiaries. All Rights Reserved.
//
// 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
// 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 model
import (
"encoding/xml"
"errors"
"fmt"
"strings"
)
// Error implements custom error.
type Error struct {
// XMLName is the name of the xml tag used XML marshalling
XMLName xml.Name `xml:"error"`
// Code is the error code returned by the management API
Code int64 `xml:"code" json:"code"`
// Description is a human readable description of the error
Description string `xml:"description" json:"description"`
// Details are additional error information
Details string `xml:"details" json:"details"`
// Retryable signifies if a request returning an error of this type should
// be retried
Retryable bool `xml:"retryable" json:"retryable"`
}
var _ error = Error{}
// Error is a method that allows us to use the Error model as go error.
func (err Error) Error() string {
if err.Description == "" {
err.Description = "Unknown"
}
if err.Details != "" {
return fmt.Sprintf("%s: %s", err.Description, err.Details)
}
return err.Description
}
// StatusCode is there so we can reference the Code field in Is method.
func (err Error) StatusCode() int64 {
return err.Code
}
// Is compare errors status.
func (err Error) Is(target error) bool {
// create intermediate interface
type statusCoder interface {
StatusCode() int64
}
var statusCoderErr statusCoder
// validate if target implements statusCoder interface,
// and compare the status codes
if errors.As(target, &statusCoderErr) {
return err.StatusCode() == statusCoderErr.StatusCode()
}
// if someone is already relying on error message comparisons, then don't break it
return strings.EqualFold(err.Error(), target.Error())
}
// Error Codes.
const (
// Request parameter cannot be found.
CodeParameterNotFound int64 = 1004
// Required parameter is missing or empty.
CodeMissingParameter int64 = 1005
// Resource not found.
CodeResourceNotFound int64 = 1019
// Exceeding limit.
CodeExceedingLimit int64 = 1031
// Internal exception occurred.
CodeInternalException int64 = 30024
// Bucket already exists.
CodeBucketAlreadyExists int64 = 40008
)