Packages
maru
0.11.0
0.14.0-pre.1
0.13.2
0.13.1
0.13.0
0.12.5
0.12.4
0.12.3
0.12.2
0.12.1
0.12.0
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.6
0.10.5
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.0
0.5.1
0.5.0
0.4.1
0.4.0
0.3.1
0.3.0
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
REST-like API micro-framework for elixir inspired by grape.
Current section
Files
Jump to
Current section
Files
lib/maru/parameter.ex
defmodule Maru.Parameter.Phoenix do
@moduledoc """
Bring maru's params parser to Phoenix, just use it as the same as maru.
Look at maru's documents for more details.
"""
@doc false
defmacro __using__(_) do
quote do
require Maru.Struct.Parameter
import Maru.Builder.DSLs, only: [helpers: 1, params: 1, params: 2]
Module.register_attribute __MODULE__, :parameter_functions, accumulate: true
@parameters []
@group []
@on_definition unquote(__MODULE__)
@before_compile unquote(__MODULE__)
end
end
@doc false
def __on_definition__(%Macro.Env{module: module}, :def, name, [_, _], guards, _body) do
Module.get_attribute(module, :parameters)
|> Enum.map(fn p -> p.runtime end)
|> case do
[] -> :ok
parameters_runtime ->
guards = [] == guards || guards
Module.put_attribute(module, :parameter_functions, {name, guards, parameters_runtime})
Module.put_attribute(module, :parameters, [])
end
end
def __on_definition__(_env, _kind, _name, _args, _guards, _body) do
:ok
end
@doc false
defmacro __before_compile__(%Macro.Env{module: module}) do
module
|> Module.get_attribute(:parameter_functions)
|> Enum.map(fn {name, guards, runtime} ->
quote do
defoverridable [{unquote(name), 2}]
def unquote(name)(conn, params) when unquote(guards) do
super(conn, Maru.Runtime.parse_params(
unquote(runtime), %{}, params
))
end
end
end)
end
end