...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package genericwebhook
17
18 import (
19 "reflect"
20 "strings"
21
22 "k8s.io/apimachinery/pkg/util/validation/field"
23 )
24
25 type Defaulter interface {
26 Default(root interface{}, field *reflect.StructField)
27 }
28
29
30
31
32
33
34 func Default(obj interface{}) field.ErrorList {
35
36 errorList := field.ErrorList{}
37
38 root := obj
39 walker := NewFieldWalker(obj, func(path *field.Path, obj interface{}, field *reflect.StructField) bool {
40 webhookAttr := ""
41 if field != nil {
42 webhookAttr = field.Tag.Get("webhook")
43 }
44 attributes := strings.Split(webhookAttr, ",")
45
46 webhook := ""
47 nilable := false
48 if len(attributes) > 0 {
49 webhook = attributes[0]
50 }
51 if len(attributes) > 1 {
52 nilable = attributes[1] == "nilable"
53 }
54
55 defaulter := getDefaulter(obj, webhook, nilable)
56 if defaulter != nil {
57 defaulter.Default(root, field)
58 }
59
60 return true
61 })
62 walker.Walk()
63
64 return errorList
65 }
66
67 func getDefaulter(obj interface{}, webhook string, nilable bool) Defaulter {
68
69
70
71
72 val := reflect.ValueOf(obj)
73
74 if defaulter, ok := obj.(Defaulter); ok {
75 if nilable || !val.IsZero() {
76 return defaulter
77 }
78 }
79
80 if webhook != "" {
81 webhookImpl := webhooks[webhook]
82
83 v := val.Convert(webhookImpl).Interface()
84 if defaulter, ok := v.(Defaulter); ok {
85 if nilable || !val.IsZero() {
86 return defaulter
87 }
88 }
89 }
90
91 return nil
92 }
93