defmodule Unleash.Strategy.Constraint do
@moduledoc """
Module that is used to verify
[constraints](https://www.unleash-hosted.com/docs/strategy-constraints/) are
met.
These constraints allow for very complex and specifc strategies to be
enacted by allowing users to specify context values to include or exclude.
"""
def verify_all(constraints, context) do
Enum.all?(constraints, &verify(&1, context))
end
defp verify(%{"contextName" => name, "operator" => op, "values" => values}, context) do
context
|> find_value(name)
|> check(op, values)
end
defp verify(%{}, _context), do: false
defp check(value, "IN", values), do: value in values
defp check(value, "NOT_IN", values), do: value not in values
defp find_value(nil, _name), do: nil
defp find_value(ctx, name) do
Map.get(
ctx,
String.to_atom(Recase.to_snake(name)),
find_value(Map.get(ctx, :properties), name)
)
end
end