func compareEQ()

in internal/pkg/eql/compare.go [14:115]


func compareEQ(left, right operand) (bool, error) {
	switch v := left.(type) {
	case *null:
		_, ok := right.(*null)
		if ok {
			return true, nil
		}
		return false, nil
	case bool:
		rV, ok := right.(bool)
		if !ok {
			return false, nil
		}
		if rV == v {
			return true, nil
		}
		return false, nil
	case int:
		switch rv := right.(type) {
		case *null:
			return false, nil
		case int:
			return v == rv, nil
		case float64:
			// TODO: check overflow, weird things will happen with precision here.
			// use modf
			return float64(v) == rv, nil
		default:
			return false, fmt.Errorf(
				"compare: ==, incompatible type to compare both operands must be numbers, left=%T, right=%T",
				left,
				right,
			)
		}
	case float64:
		switch rv := right.(type) {
		case *null:
			return false, nil
		case int:
			return v == float64(rv), nil
		case float64:
			return v == rv, nil
		default:
			return false, fmt.Errorf(
				"compare: ==, incompatible type to compare both operand must be numbers, left=%T, right=%T",
				left,
				right,
			)
		}
	case string:
		rV, ok := right.(string)
		if !ok {
			return false, nil
		}
		if rV == v {
			return true, nil
		}
		return false, nil
	case []interface{}:
		rV, ok := right.([]interface{})
		if !ok {
			return false, nil
		}
		if len(v) != len(rV) {
			return false, nil
		}
		for i := range v {
			b, err := compareEQ(v[i], rV[i])
			if err != nil {
				return false, err
			}
			if !b {
				return false, nil
			}
		}
		return true, nil
	case map[string]interface{}:
		rV, ok := right.(map[string]interface{})
		if !ok {
			return false, nil
		}
		if !keysEqual(v, rV) {
			return false, nil
		}
		for i := range v {
			b, err := compareEQ(v[i], rV[i])
			if err != nil {
				return false, err
			}
			if !b {
				return false, nil
			}
		}
		return true, nil
	default:
		return false, fmt.Errorf(
			"compare: ==, incompatible type to compare, left=%T, right=%T",
			left,
			right,
		)
	}
}