Skip to content

Commit 3c2230a

Browse files
fix: correct bugs in values handling
1 parent 118dee6 commit 3c2230a

File tree

1 file changed

+58
-26
lines changed

1 file changed

+58
-26
lines changed

internal/restResources/support.go

Lines changed: 58 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,9 @@ func processFields(callInfo *CallInfo, fields map[string]interface{}, reqConfigu
122122
}
123123
reqConfiguration.Query[field] = stringVal
124124
} else if callInfo.ReqParams.Body.Contains(field) {
125-
mapBody[field] = value
125+
if mapBody[field] == nil {
126+
mapBody[field] = value
127+
}
126128
}
127129
}
128130
}
@@ -134,11 +136,11 @@ func isCRUpdated(mg *unstructured.Unstructured, rm map[string]interface{}) (bool
134136
return false, fmt.Errorf("error getting spec fields: %w", err)
135137
}
136138

137-
return compareExisting(m, rm), nil
139+
return compareExisting(m, rm)
138140
}
139141

140142
// compareExisting recursively compares fields between two maps and logs differences.
141-
func compareExisting(mg map[string]interface{}, rm map[string]interface{}, path ...string) bool {
143+
func compareExisting(mg map[string]interface{}, rm map[string]interface{}, path ...string) (bool, error) {
142144
for key, value := range mg {
143145
currentPath := append(path, key)
144146
pathStr := fmt.Sprintf("%v", currentPath)
@@ -148,63 +150,81 @@ func compareExisting(mg map[string]interface{}, rm map[string]interface{}, path
148150
continue
149151
}
150152

153+
fmt.Println("Comparing", pathStr, value, rmValue)
154+
155+
if reflect.TypeOf(value).Kind() != reflect.TypeOf(rmValue).Kind() {
156+
return false, fmt.Errorf("types differ at %s - %s is different from %s", pathStr, reflect.TypeOf(value).Kind(), reflect.TypeOf(rmValue).Kind())
157+
}
158+
151159
switch reflect.TypeOf(value).Kind() {
152160
case reflect.Map:
153161
mgMap, ok1 := value.(map[string]interface{})
154162
if !ok1 {
155163
fmt.Printf("Type assertion failed for map at '%s'\n", pathStr)
156-
continue
164+
return false, fmt.Errorf("type assertion failed for map at %s", pathStr)
157165
}
158166
rmMap, ok2 := rmValue.(map[string]interface{})
159167
if !ok2 {
160168
fmt.Printf("Type assertion failed for map at '%s'\n", pathStr)
161-
continue
169+
return false, fmt.Errorf("type assertion failed for map at %s", pathStr)
162170
}
163-
if !compareExisting(mgMap, rmMap, currentPath...) {
171+
ok, err := compareExisting(mgMap, rmMap, currentPath...)
172+
if err != nil {
173+
return false, err
174+
}
175+
if !ok {
164176
fmt.Printf("Values differ at '%s'\n", pathStr)
165-
return false
177+
return false, nil
166178
}
167179
case reflect.Slice:
168180
valueSlice, ok1 := value.([]interface{})
169181
if !ok1 || reflect.TypeOf(rmValue).Kind() != reflect.Slice {
170182
fmt.Printf("Values are not both slices or type assertion failed at '%s'\n", pathStr)
171-
continue
183+
return false, fmt.Errorf("values are not both slices or type assertion failed at %s", pathStr)
172184
}
173185
rmSlice, ok2 := rmValue.([]interface{})
174186
if !ok2 {
175187
fmt.Printf("Type assertion failed for slice at '%s'\n", pathStr)
176-
continue
188+
return false, fmt.Errorf("type assertion failed for slice at %s", pathStr)
177189
}
178190
for i, v := range valueSlice {
179191
if reflect.TypeOf(v).Kind() == reflect.Map {
180192
mgMap, ok1 := v.(map[string]interface{})
181193
if !ok1 {
182194
fmt.Printf("Type assertion failed for map at '%s'\n", pathStr)
183-
continue
195+
return false, fmt.Errorf("type assertion failed for map at %s", pathStr)
184196
}
185197
rmMap, ok2 := rmSlice[i].(map[string]interface{})
186198
if !ok2 {
187199
fmt.Printf("Type assertion failed for map at '%s'\n", pathStr)
188-
continue
200+
return false, fmt.Errorf("type assertion failed for map at %s", pathStr)
201+
}
202+
ok, err := compareExisting(mgMap, rmMap, currentPath...)
203+
if err != nil {
204+
return false, err
189205
}
190-
if !compareExisting(mgMap, rmMap, currentPath...) {
206+
if !ok {
191207
fmt.Printf("Values differ at '%s'\n", pathStr)
192-
return false
208+
return false, nil
193209
}
194210
} else if v != rmSlice[i] {
195211
fmt.Printf("Values differ at '%s'\n", pathStr)
196-
return false
212+
return false, nil
197213
}
198214
}
199215
default:
200-
if !compareAny(value, rmValue) {
216+
ok, err := compareAny(value, rmValue)
217+
if err != nil {
218+
return false, err
219+
}
220+
if !ok {
201221
fmt.Printf("Values differ at '%s' %s %s\n", pathStr, value, rmValue)
202-
return false
222+
return false, nil
203223
}
204224
}
205225
}
206226

207-
return true
227+
return true, nil
208228
}
209229
func numberCaster(value interface{}) int64 {
210230
switch v := value.(type) {
@@ -237,23 +257,35 @@ func numberCaster(value interface{}) int64 {
237257
}
238258
}
239259

240-
func compareAny(a any, b any) bool {
260+
func compareAny(a any, b any) (bool, error) {
241261
//if is number compare as number
242262
switch a.(type) {
243263
case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64:
244264
ia := numberCaster(a)
245265
ib := numberCaster(b)
246-
return ia == ib
266+
return ia == ib, nil
247267
case string:
248-
sa := a.(string)
249-
sb := b.(string)
250-
return sa == sb
268+
sa, ok := a.(string)
269+
if !ok {
270+
return false, fmt.Errorf("Type assertion failed - to string: %v", a)
271+
}
272+
sb, ok := b.(string)
273+
if !ok {
274+
return false, fmt.Errorf("Type assertion failed - to string: %v", b)
275+
}
276+
return sa == sb, nil
251277
case bool:
252-
ba := a.(bool)
253-
bb := b.(bool)
254-
return ba == bb
278+
ba, ok := a.(bool)
279+
if !ok {
280+
return false, fmt.Errorf("Type assertion failed - to bool: %v", a)
281+
}
282+
bb, ok := b.(bool)
283+
if !ok {
284+
return false, fmt.Errorf("Type assertion failed - to bool: %v", b)
285+
}
286+
return ba == bb, nil
255287
default:
256-
return reflect.DeepEqual(a, b)
288+
return reflect.DeepEqual(a, b), nil
257289
}
258290
}
259291

0 commit comments

Comments
 (0)