Current section
Files
Jump to
Current section
Files
lib/statement.ex
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