func getConditionsAsMap()

in operatortrace-go/pkg/client/conditions.go [125:174]


func getConditionsAsMap(obj client.Object, scheme *runtime.Scheme) ([]map[string]interface{}, error) {
	gvk, err := apiutil.GVKForObject(obj, scheme)
	if err != nil {
		return nil, fmt.Errorf("problem getting the GVK: %w", err)
	}

	objTyped, err := scheme.New(gvk)
	if err != nil {
		return nil, fmt.Errorf("problem creating new object of kind %s: %w", gvk.Kind, err)
	}

	if err := scheme.Convert(obj, objTyped, nil); err != nil {
		return nil, fmt.Errorf("problem converting object to kind %s: %w", gvk.Kind, err)
	}

	val := reflect.ValueOf(objTyped)
	statusField := val.Elem().FieldByName("Status")
	if !statusField.IsValid() {
		return nil, fmt.Errorf("status field not found in kind %s", gvk.Kind)
	}

	conditionsField := statusField.FieldByName("Conditions")
	if !conditionsField.IsValid() {
		return nil, fmt.Errorf("conditions field not found in kind %s", gvk.Kind)
	}

	conditionsValue := conditionsField.Interface()
	val = reflect.ValueOf(conditionsValue)
	if val.Kind() != reflect.Slice {
		return nil, fmt.Errorf("conditions field is not a slice")
	}

	var conditionsAsMap []map[string]interface{}
	for i := 0; i < val.Len(); i++ {
		conditionVal := val.Index(i)
		if conditionVal.Kind() == reflect.Ptr {
			conditionVal = conditionVal.Elem()
		}

		conditionMap := make(map[string]interface{})
		for _, field := range reflect.VisibleFields(conditionVal.Type()) {
			fieldValue := conditionVal.FieldByIndex(field.Index)
			conditionMap[field.Name] = fieldValue.Interface()
		}

		conditionsAsMap = append(conditionsAsMap, conditionMap)
	}

	return conditionsAsMap, nil
}