-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvalidation.go
97 lines (78 loc) · 1.9 KB
/
validation.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
package seedwork
import (
"fmt"
"strings"
validation "github.com/go-ozzo/ozzo-validation/v4"
)
const (
Required = "required"
Invalid = "invalid"
IsNotInreger = "is_not_integer"
)
func Validate(v validation.Validatable, prefix string) error {
err := v.Validate()
if err == nil {
return nil
}
messages := ErrorMessages(prefix, err)
return NewValidationError(messages)
}
func ErrorMessages(prefix string, err error) map[string][]string {
errs, ok := err.(validation.Errors)
if !ok {
return nil
}
messages := make(map[string][]string)
for k, v := range errs {
if _, ok := v.(validation.Errors); ok {
key := fmt.Sprintf("%s.%s", prefix, ToSnakeCase(k))
errMap := ErrorMessages(key, v)
for k, v := range errMap {
messages[ToSnakeCase(k)] = v
}
} else {
key := fmt.Sprintf("%s.%s", prefix, ToSnakeCase(k))
messages[key] = append(messages[key], v.Error())
}
}
return messages
}
func ToSnakeCase(str string) string {
return ToScreamingDelimited(str, '_')
}
func ToScreamingDelimited(s string, delimiter uint8) string {
s = strings.TrimSpace(s)
n := strings.Builder{}
n.Grow(len(s) + 2) // nominal 2 bytes of extra space for inserted delimiters
if len(s) != 0 {
currIsCap := s[0] >= 'A' && s[0] <= 'Z'
if currIsCap {
n.WriteByte(s[0] - 'A' + 'a')
} else {
n.WriteByte(s[0])
}
}
for i := 1; i < len(s); i++ {
prevIsCap := s[i] >= 'A' && s[i] <= 'Z'
prevIsLow := s[i-1] >= 'a' && s[i-1] <= 'z'
currIsCap := s[i] >= 'A' && s[i] <= 'Z'
hasNext := len(s) > i+1
var nextIsLow bool
var next byte
if hasNext {
next = s[i+1]
nextIsLow = s[i+1] >= 'a' && s[i+1] <= 'z'
}
if prevIsLow && currIsCap {
n.WriteByte(delimiter)
} else if currIsCap && prevIsCap && hasNext && nextIsLow && next != 's' {
n.WriteByte(delimiter)
}
if currIsCap {
n.WriteByte(s[i] - 'A' + 'a')
} else {
n.WriteByte(s[i])
}
}
return n.String()
}