1
16
17 package defaulting
18
19 import (
20 "fmt"
21
22 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
23 )
24
25
26
27
28 type AccessorFunc func(obj map[string]interface{}) (x interface{}, found bool, err error)
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 type SurroundingObjectFunc func(focus interface{}) (map[string]interface{}, AccessorFunc, error)
61
62
63
64 func NewRootObjectFunc() SurroundingObjectFunc {
65 return func(x interface{}) (map[string]interface{}, AccessorFunc, error) {
66 obj, ok := x.(map[string]interface{})
67 if !ok {
68 return nil, nil, fmt.Errorf("object root default value must be of object type")
69 }
70 return obj, func(root map[string]interface{}) (interface{}, bool, error) {
71 return root, true, nil
72 }, nil
73 }
74 }
75
76
77
78 func (f SurroundingObjectFunc) WithTypeMeta(meta metav1.TypeMeta) SurroundingObjectFunc {
79 return func(x interface{}) (map[string]interface{}, AccessorFunc, error) {
80 obj, acc, err := f(x)
81 if err != nil {
82 return nil, nil, err
83 }
84 if obj == nil {
85 obj = map[string]interface{}{}
86 }
87 if _, found := obj["kind"]; !found {
88 obj["kind"] = meta.Kind
89 }
90 if _, found := obj["apiVersion"]; !found {
91 obj["apiVersion"] = meta.APIVersion
92 }
93 return obj, acc, err
94 }
95 }
96
97
98 func (f SurroundingObjectFunc) Child(k string) SurroundingObjectFunc {
99 return func(x interface{}) (map[string]interface{}, AccessorFunc, error) {
100 obj, acc, err := f(map[string]interface{}{k: x})
101 if err != nil {
102 return nil, nil, err
103 }
104 return obj, func(obj map[string]interface{}) (interface{}, bool, error) {
105 x, found, err := acc(obj)
106 if err != nil {
107 return nil, false, fmt.Errorf(".%s%v", k, err)
108 }
109 if !found {
110 return nil, false, nil
111 }
112 if x, ok := x.(map[string]interface{}); !ok {
113 return nil, false, fmt.Errorf(".%s must be of object type", k)
114 } else if v, found := x[k]; !found {
115 return nil, false, nil
116 } else {
117 return v, true, nil
118 }
119 }, err
120 }
121 }
122
123
124 func (f SurroundingObjectFunc) Index() SurroundingObjectFunc {
125 return func(focus interface{}) (map[string]interface{}, AccessorFunc, error) {
126 obj, acc, err := f([]interface{}{focus})
127 if err != nil {
128 return nil, nil, err
129 }
130 return obj, func(obj map[string]interface{}) (interface{}, bool, error) {
131 x, found, err := acc(obj)
132 if err != nil {
133 return nil, false, fmt.Errorf("[]%v", err)
134 }
135 if !found {
136 return nil, false, nil
137 }
138 if x, ok := x.([]interface{}); !ok {
139 return nil, false, fmt.Errorf("[] must be of array type")
140 } else if len(x) == 0 {
141 return nil, false, nil
142 } else {
143 return x[0], true, nil
144 }
145 }, err
146 }
147 }
148
View as plain text