defmodule Maru.Params.PhoenixController do
defmacro __using__(_) do
quote do
use Maru.Params.Builder
Module.register_attribute(__MODULE__, :actions, accumulate: true)
import unquote(__MODULE__)
@before_compile unquote(__MODULE__)
end
end
defmacro params(action, do: block) do
quote do
unquote(block)
@actions {unquote(action), Maru.Params.Builder.pop_params(__ENV__)}
end
end
defmacro __before_compile__(%Macro.Env{module: module}) do
module
|> Module.get_attribute(:actions)
|> Enum.map(fn {action, params} ->
params_runtime = Enum.map(params, &Map.get(&1, :runtime))
quote do
defoverridable [{unquote(action), 2}]
def unquote(action)(conn, params) do
super(conn, Maru.Params.Runtime.parse_params(unquote(params_runtime), params))
end
end
end)
end
end