/
errors.go
150 lines (130 loc) · 3.37 KB
/
errors.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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
package appengine
import (
"errors"
"fmt"
"strings"
"sync"
)
var _ error = &MultiError{}
// ErrInvalidHeader is Header が invalid な時に返す
var ErrInvalidHeader = &Error{
Code: "InvalidHeader",
Message: "InvalidHeader",
KV: map[string]interface{}{},
}
// ErrInvalidRequest is 引数が invalid な時に返す
var ErrInvalidArgument = &Error{
Code: "InvalidArgument",
Message: "InvalidArgument",
KV: map[string]interface{}{},
}
// ErrCreateMultiTask is CreateMultiTask の時に MultiError に入れる Error
var ErrCreateMultiTask = &Error{
Code: "FailedCreateMultiTask",
Message: "FailedCreateMultiTask",
KV: map[string]interface{}{},
}
// ErrAlreadyExists is すでに存在している場合の Error
// 主に TaskName が重複した場合に返す https://cloud.google.com/tasks/docs/reference/rest/v2/projects.locations.queues.tasks/create#body.request_body.FIELDS.task
var ErrAlreadyExists = &Error{
Code: "AlreadyExists",
Message: "AlreadyExists",
KV: map[string]interface{}{},
}
// Error is Error情報を保持する struct
type Error struct {
Code string
Message string
KV map[string]interface{}
err error
}
// Error is error interface func
func (e *Error) Error() string {
if e.KV == nil || len(e.KV) < 1 {
return fmt.Sprintf("%s: %s: %s", e.Code, e.Message, e.err)
}
return fmt.Sprintf("%s: %s: attribute:%+v :%s", e.Code, e.Message, e.KV, e.err)
}
// Is is err equal check
func (e *Error) Is(target error) bool {
var appErr *Error
if !errors.As(target, &appErr) {
return false
}
return e.Code == appErr.Code
}
// Unwrap is return unwrap error
func (e *Error) Unwrap() error {
return e.err
}
// MultiError is 複数の error を返す
type MultiError struct {
mutex sync.Mutex
Errors []*Error
}
func (e *MultiError) Error() string {
builder := strings.Builder{}
for i, v := range e.Errors {
builder.WriteString(v.Error())
if i < len(e.Errors) {
builder.WriteString("\n")
}
}
return builder.String()
}
// Is is err equal check
func (e *MultiError) Is(target error) bool {
var appErr *MultiError
return errors.As(target, &appErr)
}
// Unwrap is return unwrap error
func (e *MultiError) Unwrap() error {
return nil
}
func (e *MultiError) Append(err *Error) {
e.mutex.Lock()
defer e.mutex.Unlock()
e.Errors = append(e.Errors, err)
}
func (e *MultiError) ErrorOrNil() error {
if len(e.Errors) > 0 {
return e
}
return nil
}
// NewErrInvalidHeader is return ErrInvalidHeader
func NewErrInvalidHeader(message string, kv map[string]interface{}, err error) error {
return &Error{
Code: ErrInvalidHeader.Code,
Message: message,
KV: kv,
err: err,
}
}
// NewErrInvalidArgument is return ErrInvalidArgument
func NewErrInvalidArgument(message string, kv map[string]interface{}, err error) error {
return &Error{
Code: ErrInvalidArgument.Code,
Message: message,
KV: kv,
err: err,
}
}
// NewErrAlreadyExists is return ErrAlreadyExists
func NewErrAlreadyExists(message string, kv map[string]interface{}, err error) *Error {
return &Error{
Code: ErrAlreadyExists.Code,
Message: message,
KV: kv,
err: err,
}
}
// NewErrCreateMultiTask is return ErrCreateMultiTask
func NewErrCreateMultiTask(message string, kv map[string]interface{}, err error) *Error {
return &Error{
Code: ErrCreateMultiTask.Code,
Message: message,
KV: kv,
err: err,
}
}