Packages
mazurka
0.3.2
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.3.39
0.3.38
0.3.37
0.3.36
0.3.35
0.3.34
0.3.33
0.3.32
0.3.31
0.3.30
0.3.29
0.3.28
0.3.27
0.3.26
0.3.25
0.3.24
0.3.23
0.3.22
0.3.21
0.3.20
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
hypermedia api toolkit
Current section
Files
Jump to
Current section
Files
lib/mazurka/resource/param.ex
defmodule Mazurka.Resource.Param do
defmacro param(name, opts \\ []) do
Mazurka.Compiler.Utils.register(__MODULE__, name, opts)
end
@doc false
def compile_global(params, _env) do
params = params
|> Enum.map(&compile_param/1)
quote do
defstruct unquote(params)
end
end
def compile(params, _env) do
Enum.reduce(params, [], &compile_assign/2)
end
defp compile_param({{name, _, _}, _opts}) when is_atom(name) do
compile_param({name, nil})
end
defp compile_param({name, _opts}) when is_atom(name) do
{name, nil}
end
defp compile_assign({name, opts}, acc) when is_atom(name) do
compile_assign({Macro.var(name, nil), opts}, acc)
end
defp compile_assign({name, [do: block]}, acc) do
expr = quote do
unquote(Macro.var(:value, nil)) = Params.get(unquote(to_string(elem(name, 0))))
unquote(block)
end
[quote do
unquote(name) = unquote(expr)
end | acc]
end
defp compile_assign(_, acc) do
acc
end
@doc false
def format(ast, type \\ :prop) do
Macro.postwalk(ast, fn
({{:., _, [{:__aliases__, _, [:Params]}, :get]}, _, []}) ->
case type do
:prop ->
quote do
prop(:params)
end
:conn ->
quote do
^^Mazurka.Resource.Param.get()
end
end
({{:., _, [{:__aliases__, _, [:Params]}, :get]}, _, [param]}) ->
case type do
:prop ->
quote do
^Dict.get(prop(:params), unquote(param))
end
:conn ->
quote do
^^Mazurka.Resource.Param.get(unquote(param))
end
end
(other) ->
other
end)
end
@doc false
def get([], conn, _parent, _ref, _attrs) do
params = Map.get(conn.private, :mazurka_params)
{:ok, params}
end
def get([name], conn, _parent, _ref, _attrs) do
params = Map.get(conn.private, :mazurka_params)
val = Map.get(params, name)
normalized = if val == nil, do: :undefined, else: URI.decode(val)
{:ok, normalized}
end
end