-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathconstraints.go
135 lines (121 loc) · 2.8 KB
/
constraints.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
package validator
import (
"fmt"
"reflect"
"regexp"
"strconv"
)
/**
Numerical Type Constraints
*/
func min(field field, param string) error {
return checkMin(field, param, false)
}
func max(field field, param string) error {
return checkMax(field, param, false)
}
func exclusiveMin(field field, param string) error {
return checkMin(field, param, true)
}
func exclusiveMax(field field, param string) error {
return checkMax(field, param, true)
}
func multipleOf(field field, param string) error {
// TODO : works only for int as of now
switch field.typ.Kind() {
case reflect.Int:
in, _ := field.value.Interface().(int)
c, err := convertInt(param, 0)
cInt := int(c)
if err != nil {
return err
}
valid := in%cInt == 0
if !valid {
return fmt.Errorf(ErrMultipleOf, field.name)
}
default:
return fmt.Errorf(ErrInvalidValidationForField, field.name)
}
return nil
}
/**
String Type Constraints
*/
func notnull(field field, param string) error {
switch field.typ.Kind() {
case reflect.String:
c, err := convertBool(param)
if err != nil {
return fmt.Errorf(ErrBadConstraint, "notnull", param, field.name)
}
if c {
in, _ := field.value.Interface().(string)
if in == "" {
return fmt.Errorf(ErrNotNull, field.name)
}
}
default:
return fmt.Errorf(ErrInvalidValidationForField, field.name)
}
return nil
}
func minLength(field field, param string) error {
switch field.typ.Kind() {
case reflect.String:
lc, _ := strconv.Atoi(param)
lv := len(fmt.Sprint(field.value))
valid := lv > lc
if !valid {
return fmt.Errorf(ErrMinLength, field.name)
}
default:
return fmt.Errorf(ErrInvalidValidationForField, field.name)
}
return nil
}
func maxLength(field field, param string) error {
switch field.typ.Kind() {
case reflect.String:
lc, _ := strconv.Atoi(param)
lv := len(fmt.Sprint(field.value))
valid := lv < lc
if !valid {
return fmt.Errorf(ErrMaxLength, field.name)
}
default:
return fmt.Errorf(ErrInvalidValidationForField, field.name)
}
return nil
}
func pattern(field field, param string) error {
switch field.typ.Kind() {
case reflect.String:
in, _ := field.value.Interface().(string)
re, err := regexp.Compile(param)
if err != nil {
return fmt.Errorf(ErrBadConstraint, "pattern", param, field.name)
}
if !re.MatchString(in) {
return fmt.Errorf(ErrPattern, field.name)
}
default:
return fmt.Errorf(ErrInvalidValidationForField, field.name)
}
return nil
}
func enum(field field, param string) error {
flag := false
switch field.value.Kind() {
case reflect.Int:
input := field.value.Interface().(int)
flag = checkIfEnumExists(strconv.Itoa(input), param, ",")
case reflect.String:
input := field.value.String()
flag = checkIfEnumExists(input, param, ",")
}
if !flag {
return fmt.Errorf(ErrEnums, field.name)
}
return nil
}