-
Notifications
You must be signed in to change notification settings - Fork 0
/
validator.go
57 lines (50 loc) · 1.84 KB
/
validator.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
// Copyright 2022 validator Author. All Rights Reserved.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package validator
import (
"github.com/billcoding/reflectx"
"reflect"
)
// Validator defines validator struct
type Validator struct {
structPtr interface{}
fields []*reflect.StructField
values []*reflect.Value
items []interface{}
lang []string
}
// New return new *Validator
func New(structPtr interface{}) *Validator {
fields, values, tags := reflectx.ParseTag(structPtr, new(Item), "alias", "validate", true)
return &Validator{structPtr, fields, values, tags, nil}
}
// Lang set supported lang
func (v *Validator) Lang(lang ...string) *Validator { v.lang = lang; return v }
// Validate return validation result
func (v *Validator) Validate() *Result {
resultItems := make([]*ResultItem, len(v.fields))
passedCount := 0
for pos := range v.fields {
field := v.fields[pos]
value := v.values[pos]
item := v.items[pos].(*Item)
resultItem := validate(item, field, value)
resultItems[pos] = resultItem
if resultItem.Passed {
passedCount++
}
}
return newResult(v.structPtr, resultItems, len(v.items) == passedCount, v.lang)
}
func validate(item *Item, field *reflect.StructField, value *reflect.Value) *ResultItem {
passed, msg := item.Validate(*field, *value)
return &ResultItem{Field: field, Passed: passed, Message: msg}
}