-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvalidator_predicate_values.go
46 lines (40 loc) · 1.21 KB
/
validator_predicate_values.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
package zql
import (
"fmt"
"reflect"
)
type ValidatorPredicateValues struct {
RequiredFieldValueTypeMap map[string]string
MaxValueSize int
}
func NewValidatorPredicateValues() *ValidatorPredicateValues {
return &ValidatorPredicateValues{
RequiredFieldValueTypeMap: make(map[string]string),
MaxValueSize: -1,
}
}
func (v *ValidatorPredicateValues) AddFieldValuePair(f FieldDesc) {
v.RequiredFieldValueTypeMap[f.Name] = f.Type
}
func (v *ValidatorPredicateValues) Validate(field, op string, _ interface{}, rt reflect.Type, rv reflect.Value) error {
if rt == nil {
return nil
}
valueType := ValueTypeToString(rt)
requiredValueType, ok := v.RequiredFieldValueTypeMap[field]
if ok && IsCompareOp(op) {
isValueTypeGoodForField := requiredValueType == valueType
if !isValueTypeGoodForField {
return NewError(fmt.Errorf("value type %v unacceptable for field %s[%s]", valueType, field, requiredValueType), ErrCodeValueTypeUnacceptableForField)
}
}
if v.MaxValueSize > 0 {
switch rt.Kind() {
case reflect.Slice, reflect.Array, reflect.String:
if rv.Len() > v.MaxValueSize {
return NewError(fmt.Errorf("exceed max value size"), ErrCodeExceedMaxValueSize)
}
}
}
return nil
}