-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patherrors.go
128 lines (109 loc) · 3.54 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
package validation
// github.com/strongo/validation
import (
"errors"
"fmt"
"strings"
)
var errValidation = errors.New("validation error")
var errBadRequest = fmt.Errorf("%w: invalid request", errValidation)
var errBadRequestFieldValue = fmt.Errorf("%w: bad field value", errBadRequest)
var errBadRecord = fmt.Errorf("%w: invalid record", errValidation)
var errBadRecordFieldValue = fmt.Errorf("%w: invalid field value", errBadRecord)
// NewBadRequestError create error
func NewBadRequestError(err error) error {
return fmt.Errorf("%w: %s", errBadRequest, err)
}
// ErrBadFieldValue reports error for a bad field value
type ErrBadFieldValue struct {
err error
Field string `json:"field"`
Message string `json:"message"`
}
func (v ErrBadFieldValue) Error() string {
return fmt.Sprintf("bad value for field [%v]: %v", v.Field, v.Message)
}
func (v ErrBadFieldValue) Unwrap() error {
return v.err
}
// NewErrBadRequestFieldValue creates an error for a bad request field value
func NewErrBadRequestFieldValue(field, message string) ErrBadFieldValue {
if strings.TrimSpace(field) == "" {
panic("field parameters is required")
}
if strings.TrimSpace(message) == "" {
panic("message parameters is required")
}
return ErrBadFieldValue{
Field: field,
Message: message,
err: errBadRequestFieldValue,
}
}
// NewErrBadRecordFieldValue creates an error for a bad record field value
func NewErrBadRecordFieldValue(field, message string) ErrBadFieldValue {
if field == "" {
panic("field is a required parameter")
}
if message == "" {
panic("message is a required parameter")
}
return ErrBadFieldValue{
Field: field,
Message: message,
err: errBadRecordFieldValue,
}
}
// NewValidationError creates a common validation error
func NewValidationError(message string) error {
if message == "" {
panic("message is a required parameter")
}
return fmt.Errorf("%w: %v", errValidation, message)
}
// IsValidationError checks if provided errors is a validation error
func IsValidationError(err error) bool {
return errors.Is(err, errValidation)
}
// IsBadRequestError checks if provided errors is a validation error
func IsBadRequestError(err error) bool {
return errors.Is(err, errBadRequest)
}
func IsBadFieldValueError(err error) bool {
if errors.Is(err, errBadRequestFieldValue) {
return true
}
if errors.Is(err, errBadRecordFieldValue) {
return true
}
return false
}
// IsBadRecordError checks if provided errors is a validation error
func IsBadRecordError(err error) bool {
return errors.Is(err, errBadRecord)
}
// NewErrRecordIsMissingRequiredField creates an error for a missing required field in a record
func NewErrRecordIsMissingRequiredField(field string) ErrBadFieldValue {
return NewErrBadRecordFieldValue(field, "missing required field")
}
// NewErrRequestIsMissingRequiredField creates an error for a missing required field in a request
func NewErrRequestIsMissingRequiredField(field string) error {
return NewBadRequestError(NewErrBadRequestFieldValue(field, "missing required field"))
}
// MustBeFieldError makes sure the provided error is a field error
func MustBeFieldError(t interface {
Helper()
Errorf(format string, args ...interface{})
}, err error, field string) {
t.Helper()
if err == nil {
t.Errorf("Should return validation error for field [%v], got err == nil", field)
} else if !IsValidationError(err) {
t.Errorf("Must be validation error, got: %v", err)
} else {
errStr := err.Error()
if !strings.Contains(errStr, fmt.Sprintf("[%v]", field)) {
t.Errorf("Should mention [team] field, got: %v", errStr)
}
}
}