/
builtins.go
142 lines (127 loc) · 2.77 KB
/
builtins.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
package valval
import (
"errors"
"fmt"
"regexp"
"unicode/utf8"
)
func errf(str string, args ...interface{}) error {
return errors.New(fmt.Sprintf(str, args...))
}
func GreaterThan(min float64) ValidatorFunc {
return NewFloatValidator(func(val float64) error {
if val <= min {
return errf("must be greater than %g", min)
}
return nil
})
}
func Min(min float64) ValidatorFunc {
return NewFloatValidator(func(val float64) error {
if val < min {
return errf("must be %g and grater", min)
}
return nil
})
}
func LessThan(max float64) ValidatorFunc {
return NewFloatValidator(func(val float64) error {
if val >= max {
return errf("must be less than %g", max)
}
return nil
})
}
func Max(max float64) ValidatorFunc {
return NewFloatValidator(func(val float64) error {
if val > max {
return errf("must be %g or less", max)
}
return nil
})
}
func Regexp(r *regexp.Regexp) ValidatorFunc {
return NewStringValidator(func(val string) error {
if !r.MatchString(val) {
return errf("must be match to the regexp %s", r.String())
}
return nil
})
}
func MinLength(min int) ValidatorFunc {
return NewStringValidator(func(str string) error {
if utf8.RuneCountInString(str) < min {
return errf("length must be %d or greater", min)
}
return nil
})
}
func MaxLength(max int) ValidatorFunc {
return NewStringValidator(func(str string) error {
if utf8.RuneCountInString(str) > max {
return errf("length must be %d or less", max)
}
return nil
})
}
func In(targetValues ...interface{}) ValidatorFunc {
return func(val interface{}) error {
for _, tv := range targetValues {
if val == tv {
return nil
}
}
return errf("invalid value. allowed are %v", targetValues)
}
}
func And(funcs ...ValidatorFunc) ValidatorFunc {
return func(val interface{}) error {
for _, f := range funcs {
if err := f(val); err != nil {
return err
}
}
return nil
}
}
func Or(funcs ...ValidatorFunc) ValidatorFunc {
return func(val interface{}) error {
var firstError error
for _, f := range funcs {
if err := f(val); err == nil {
return nil
} else {
if firstError == nil {
firstError = err
}
}
}
return firstError
}
}
func MinSliceLength(min int) SliceValidatorFunc {
return func(slice []interface{}) error {
if len(slice) < min {
return errf("length must be %d or greater", min)
}
return nil
}
}
func MaxSliceLength(max int) SliceValidatorFunc {
return func(slice []interface{}) error {
if len(slice) > max {
return errf("length must be %d or less", max)
}
return nil
}
}
func RequiredFields(fs ...string) ObjectValidatorFunc {
return func(content map[string]interface{}) error {
for _, f := range fs {
if content[f] == nil {
return errf("field %s is required", f)
}
}
return nil
}
}