-
Notifications
You must be signed in to change notification settings - Fork 0
/
reflect.go
41 lines (35 loc) · 1.12 KB
/
reflect.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
package pantry
import (
"errors"
"reflect"
ref "github.com/yazver/golibs/reflect"
)
var (
errValueIsNil = errors.New("Invalid value, should be not nil")
errValueIsNotPointer = errors.New("Invalid value, should be pointer")
errValueIsNotStruct = errors.New("Invalid value, should be struct")
errValueIsNotEditable = errors.New("Invalid value, should be editable")
)
type processField func(value reflect.Value, name string, tag reflect.StructTag, state *ref.State) error
func traverseStruct(v interface{}, process processField) error {
value := reflect.ValueOf(v)
if value.IsNil() {
return errValueIsNil
}
if value.Kind() != reflect.Ptr {
return errValueIsNotPointer
}
value = reflect.Indirect(value)
if value.Kind() != reflect.Struct {
return errValueIsNotStruct
}
if !value.CanSet() {
return errValueIsNotEditable
}
return traverseStructValue(value, process)
}
func traverseStructValue(v reflect.Value, process processField) error {
return ref.TraverseValueFields(v, func(value reflect.Value, state *ref.State, field *reflect.StructField) error {
return process(value, field.Name, field.Tag, state)
})
}