Unleash/unleash-client-go

View on GitHub
internal/constraints/check.go

Summary

Maintainability
A
0 mins
Test Coverage
package constraints

import (
    "fmt"

    "github.com/Unleash/unleash-client-go/v3/api"
    "github.com/Unleash/unleash-client-go/v3/context"
)

// Check checks if all the constraints are fulfilled by the context.
func Check(ctx *context.Context, constraints []api.Constraint) (bool, error) {
    for _, c := range constraints {
        if ok, err := checkConstraintInvertible(ctx, c); !ok || err != nil {
            return false, err
        }
    }

    return true, nil
}

// checkConstraintInvertible inverts the result from checkConstraint if required.
func checkConstraintInvertible(ctx *context.Context, constraint api.Constraint) (bool, error) {
    ok, err := checkConstraint(ctx, constraint)

    if constraint.Inverted {
        return !ok, err
    }

    return ok, err
}

// checkConstraint checks if a specific constraint is fulfilled by the context.
func checkConstraint(ctx *context.Context, constraint api.Constraint) (bool, error) {
    switch constraint.Operator {
    case api.OperatorIn:
        return operatorIn(ctx, constraint), nil
    case api.OperatorNotIn:
        return operatorNotIn(ctx, constraint), nil
    case api.OperatorStrContains:
        return operatorStrContains(ctx, constraint), nil
    case api.OperatorStrStartsWith:
        return operatorStrStartsWith(ctx, constraint), nil
    case api.OperatorStrEndsWith:
        return operatorStrEndsWith(ctx, constraint), nil
    case api.OperatorNumEq:
        return operatorNumEq(ctx, constraint)
    case api.OperatorNumLt:
        return operatorNumLt(ctx, constraint)
    case api.OperatorNumLte:
        return operatorNumLte(ctx, constraint)
    case api.OperatorNumGt:
        return operatorNumGt(ctx, constraint)
    case api.OperatorNumGte:
        return operatorNumGte(ctx, constraint)
    case api.OperatorDateBefore:
        return operatorDateBefore(ctx, constraint)
    case api.OperatorDateAfter:
        return operatorDateAfter(ctx, constraint)
    case api.OperatorSemverEq:
        return operatorSemverEq(ctx, constraint)
    case api.OperatorSemverLt:
        return operatorSemverLt(ctx, constraint)
    case api.OperatorSemverGt:
        return operatorSemverGt(ctx, constraint)
    default:
        return false, fmt.Errorf("unknown constraint operator: %s", constraint.Operator)
    }
}