defmodule Carny do alias Carny.{Identifier, Policy} def require_permission(privilege, %Identifier{} = id, %Policy{} = policy, f) do case Policy.authorized?(privilege, id, policy) do true -> f.() false -> {:error, :unauthorized} end end def require_permission(privilege, id, policy, f) do id = id |> atom_map() |> Identifier.from_map() require_permission(privilege, id, Policy.from_map(policy), f) end defp atom_map(t), do: Map.new(t, fn {k, v} -> {String.to_atom(k), v} end) end