-
Notifications
You must be signed in to change notification settings - Fork 2
/
errors.go
130 lines (109 loc) · 2.68 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
/*
Copyright SecureKey Technologies Inc. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package errors
import (
"fmt"
"github.com/pkg/errors"
"github.com/rs/xid"
)
// Error extends error with
// additional context
type Error interface {
error
// Status returns the error code
ErrorCode() ErrorCode
// Generate log msg
GenerateLogMsg() string
// Generate client error msg
GenerateClientErrorMsg() string
}
type customError struct {
error
code ErrorCode
errorID string
}
// New returns a new Error
func New(code ErrorCode, msg string) Error {
return &customError{
error: errors.New(msg),
code: code,
errorID: generateErrorID(),
}
}
// Wrap returns a new Error
func Wrap(code ErrorCode, cause error, msg string) Error {
return &customError{
error: errors.Wrap(cause, msg),
code: code,
errorID: generateErrorID(),
}
}
// Wrapf returns a new Error
func Wrapf(code ErrorCode, cause error, fmt string, args ...interface{}) Error {
return &customError{
error: errors.Wrapf(cause, fmt, args...),
code: code,
errorID: generateErrorID(),
}
}
// Errorf returns a new Error
func Errorf(code ErrorCode, fmt string, args ...interface{}) Error {
return &customError{
error: errors.Errorf(fmt, args...),
code: code,
errorID: generateErrorID(),
}
}
// CreateError returns custom error
func CreateError(err error, code ErrorCode, msg string) Error {
errorObj, ok := GetError(err)
if !ok {
errorObj = WithMessage(code, err, msg)
}
return errorObj
}
// GetError returns custom error
func GetError(err error) (Error, bool) {
if s, ok := err.(Error); ok {
return s, true
}
unwrappedErr := errors.Cause(err)
if s, ok := unwrappedErr.(Error); ok {
return s, true
}
return nil, false
}
// WithMessage returns a new Error
func WithMessage(code ErrorCode, err error, msg string) Error {
return &customError{
error: errors.WithMessage(err, msg),
code: code,
errorID: generateErrorID(),
}
}
// generateErrorID return error ID
func generateErrorID() string {
return xid.New().String()
}
// ErrorCode returns the error code
func (e *customError) ErrorCode() ErrorCode {
return e.code
}
// ErrorID returns the error ID
func (e *customError) ErrorID() string {
return e.errorID
}
// GenerateLogMsg returns the log msg
func (e *customError) GenerateLogMsg() string {
return fmt.Sprintf("errorID:%s errorCode:%s error:%v", e.errorID, e.code, e.error)
}
// GenerateClientErrorMsg returns the client error msg
func (e *customError) GenerateClientErrorMsg() string {
return fmt.Sprintf("errorID:%s errorCode:%s error:%v", e.errorID, e.code, e.error)
}
// Cause returns the cause of the error
func (e *customError) Cause() error {
return e.error
}