package helpers import "fmt" // DynamicCompare compares two values dynamically and returns true if they are equal. // // Parameters: // // - s: The first value to compare. // // - u: The second value to compare. // // Returns: // // - bool: True if the values are equal, false otherwise. // // - error: An error if the values cannot be compared. func DynamicCompare(s interface{}, u interface{}) (bool, error) { switch t := s.(type) { case bool: u, ok := u.(bool) if !ok { return false, fmt.Errorf("[bool] cannot compare %T and %T, %v and %v", t, u, s, u) } return t == u, nil case string: u, ok := u.(string) if !ok { return false, fmt.Errorf("[string] cannot compare %T and %T, %v and %v", t, u, s, u) } return t == u, nil case int: u, ok := u.(int) if !ok { return false, fmt.Errorf("[int] cannot compare %T and %T, %v and %v", t, u, s, u) } return t == u, nil case float64: u, ok := u.(float64) if !ok { return false, fmt.Errorf("[float64] cannot compare %T and %T, %v and %v", t, u, s, u) } return t == u, nil case nil: return t == u, nil case []interface{}: for i := range t { if ok, err := DynamicCompare(t[i], u); err != nil { return false, err } else if !ok { return false, nil } } default: return false, fmt.Errorf("[unknown] not in case. Cannot compare %T and %T, %v and %v", t, u, s, u) } return false, fmt.Errorf("[unknown] unexpected error") }