Packages
mazurka
0.3.21
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(name_to_binary(name)))
unquote(block)
end
[quote do
unquote(name) = unquote(expr)
end | acc]
end
defp compile_assign({name, _}, acc) do
[quote do
unquote(name) = Params.get(unquote(name_to_binary(name)))
end | acc]
end
defp name_to_binary({name, _meta, _context}) when is_atom(name) do
to_string(name)
end
defp name_to_binary(name) when is_atom(name) do
to_string(name)
end
@doc false
def format(ast, type \\ :prop) do
Mazurka.Compiler.Utils.postwalk(ast, fn
({{:., _, [{:__aliases__, _, [:Params]}, :get]}, _, []}) ->
get(type)
({{:., _, [params, :get]}, _, []}) when params in [:Params, Elixir.Params, __MODULE__] ->
get(type)
({{:., _, [{:__aliases__, _, [:Params]}, :get]}, _, [name]}) ->
get(name, type)
({{:., _, [params, :get]}, _, [name]}) when params in [:Params, Elixir.Params, __MODULE__] ->
get(name, type)
(other) ->
other
end)
end
defp get(:prop) do
{:etude_prop, [], [:params]}
end
defp get(:conn) do
quote do
^^Mazurka.Resource.Param.get()
end
end
defp get(name, :prop) do
quote do
^Mazurka.Runtime.get_param(unquote(get(:prop)), unquote(name))
end
end
defp get(name, :conn) do
quote do
^^Mazurka.Resource.Param.get(unquote(name))
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