-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcustom_errors.go
67 lines (53 loc) · 1.38 KB
/
custom_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
package laravalidate
import (
"reflect"
)
type CustomError struct {
Key string
Resolver MessageResolver
}
var customErrorType = reflect.TypeOf(CustomError{})
func (v *Validator) CustomValidationRules() []CustomError {
if v.customValidationMessagesCache != nil {
return v.customValidationMessagesCache
}
validationMessagesMethod := v.inputValue.MethodByName("ValidationMessages")
if !validationMessagesMethod.IsValid() {
return nil
}
if !validatorMethodValid(validationMessagesMethod.Type()) {
return nil
}
customValidationMessages := validationMessagesMethod.Call([]reflect.Value{})
customMsg := customValidationMessages[0].Interface().([]CustomError)
if len(customMsg) == 0 {
return nil
}
v.customValidationMessagesCache = customMsg
return v.customValidationMessagesCache
}
func validatorMethodValid(fnType reflect.Type) bool {
if fnType.NumIn() != 0 {
return false
}
if fnType.NumOut() != 1 {
return false
}
outType := fnType.Out(0)
if outType.Kind() != reflect.Slice {
return false
}
return outType.Elem().String() == customErrorType.String()
}
func (v *Validator) CustomValidationRule(ruleName string, stack Stack) MessageResolver {
customErrors := v.CustomValidationRules()
if customErrors == nil {
return nil
}
for _, err := range customErrors {
if stack.LooslyEqualsWithRule(err.Key, ruleName) {
return err.Resolver
}
}
return nil
}