defmodule Carny.Statement do @moduledoc """ Associates a bucket of resources with an :allow or :deny. On their own not sure useful main use is to be composed into Policies. """ alias __MODULE__ alias Carny.Identifier defstruct effect: :allow, resources: [] @doc """ Checks if an identifier passes a statement. ## Examples iex> Carny.Statement.passes?(%Carny.Identifier{}, %Carny.Statement{resources: [%Carny.Identifier{}]}) true """ def passes?( %Identifier{} = identifier, %Statement{resources: resources, effect: :allow} ) when length(resources) > 0 do Enum.reduce_while(resources, true, fn resource, true -> {:cont, Identifier.validate_against(identifier, resource)} _resource, false -> {:halt, false} end) end def passes?( %Identifier{} = identifier, %Statement{resources: resources, effect: :deny} = statement ) when length(resources) > 0 do not passes?(identifier, statement) end def passes?(_, _), do: false end